2015-04-16 108 views
0

比方说,我有以下HTML:如何查找元素是否包含使用jQuery的id ='x'的子元素?

<div class"my-class"> 
    <div id="something"> 
     blah 
    </div> 
</div> 
<div class"my-class"> 
    <div id="something-else"> 
     <a href="/" id="x">bluh</a> 
    </div> 
</div> 

当我遍历我想找到一个包含一个子元素的一个(或子子元素像.my-class类的所有元素我上面的例子),编号为#x。所以在上面的例子中,我想找到类.my-class的第二个元素。

因此,像这样:

$(".my-class").each(function() { 
    if ($(this).containsSubElementWithId("#x")){ // <= HOW CAN I DO THIS? 
     // Do something with $(this) 
    } 
}); 

有谁知道我怎么能测试一个元素是否包含具有一定ID的另一个元素?欢迎所有提示!

+2

'如果($(本).find( '#X')的长度)'应该做 – phylax

+0

有很多复杂的解决方案所示,但我已经加了非常简单的一个给你下面,这给你在一个操作中的所有匹配(不需要'每个')。 –

回答

3

还有一个更简单的方法:

var matches = $(".my-class:has(#x)"); 
// Do something with the matching elements 

的jsfiddle:http://jsfiddle.net/TrueBlueAussie/kj1wzytw/

如你正在寻找的基于ID的元件,其可以仅具有单个匹配,“最快”的搜索将是一个ID搜索,随后closest

例如

var matches = $('#x').closest('.my-class'); 

但如果你有多个可能的匹配,(类或ID前缀等),用第一种方法。

例如(IDS起开始x):

var matches = $(".my-class:has([id^=x])"); 

的jsfiddle:http://jsfiddle.net/TrueBlueAussie/kj1wzytw/2/

一般类搜索几乎是一样快的ID搜索,在现代的浏览器,所以你会过得更好使用类为多个比赛。

例如

var matches = $(".my-class:has(.x)"); 

的jsfiddle:http://jsfiddle.net/TrueBlueAussie/kj1wzytw/3/

+0

你是伟大的人。你解释每一点的方式。我想我需要向你学习+1 :)完美的答案 –

2

可以使用has()方法:

$(".my-class").each(function() { 
    if ($(this).has("#x").length){ 
     // Do something with $(this) 
    } 
}); 

$(this).find('#x').length也会起作用。

+0

如果这个元素的id为'x'且if([])'为真,那么'$(this).has('#x')'会变成'[]' – phylax

+0

你说得对,我的错。 –

+1

当然'var match = $(“。my-class:has(#x)”);',那么对'match'做些什么比在jQuery中保留'each'好?添加下面的替代。 –

1

尝试用 -

$(this).find("[id='x']"); 

对于检查它 -

$(this).find("[id='x']").length; 
+0

几件事情 - 属性选择器比id选择器慢很多,并且这将始终返回一个对象,因此总是等于true。你需要返回'length'属性。 –

+0

感谢您的提示。将在下次照顾。 :) –

+0

@TrueBlueAussie明白了。谢谢。 –

0

试试这个:

var myClassElement = $(".my-class #x").parents('.my-class'); 
// Do something with myClassElement 

如果你想要做的东西。我-class元素的事件,如果它不包含#X元素使用:

$(".my-class").each(function() { 
    var containsXElement = $(this).find("#x").length > 0; 
    if (containsXElement){ 
     // Do something with $(this) 
    } 
}); 
+0

问题是检查id是否可用在子元素中。这是如何工作的? –

+0

此示例搜索每个.my-class容器中的#x元素,如果存在,则会返回父.my-class元素 – Vasilev

+0

感谢您的确如此,它确实是我想要的。问题是,如果它不包含'#x'元素,我有时想对元素做些什么对不起,我应该提到这一点。 – kramer65

0

相反迭代就可以直接使用closest选择元素:

var elem = $('.my-class #x').closest('.my-class'); 

现在,因为一个id是独一无二的,你也可以这样做:

var elem = $('#x').closest('.my-class'); 
2

尝试使用each()功能,并检查特定元素的长度:

var func = function() { 
 
    $('.my-class').each(function() { 
 
    var that = $(this); 
 
    if (that.find('#x').length > 0) { 
 
     console.log('found!'); 
 
     // that.something()... 
 
    } 
 
    }); 
 
} 
 
    
 
func();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="my-class"> 
 
    <div id="something"> 
 
     blah 
 
    </div> 
 
</div> 
 
<div class="my-class"> 
 
    <div id="something-else"> 
 
     <a href="/" id="x">bluh</a> 
 
    </div> 
 
</div>

+0

我可以问一下,为什么你需要额外的步骤'var that = $(this);'? – kramer65

+0

仅用于$(this)对象的进一步操作。例如:if(that.length> 0){that.css({'color':'red'})} – kapantzak

+1

@kapantzak:我可以为你推荐一些东西吗?如果你总是使用'$'作为jQuery对象的前缀,'$ this'就成为一个非常易读的变量来存放'$(this)'。 (这也使文本编辑一个到其他琐事):) –

0
$(".my-class").each(function() { 

    if ($(this).find("a[id=x]")){ 
    //do whatever you want. 
    } 
}); 
+0

这只会检查链接,而不会检查具有该ID的其他元素。 – kramer65

+0

在这种情况下,请尝试.find('#x');或.find(“[id ='x']”); –

0

如果你只希望定位具有元素DIV,我建议你先找到该元素,然后遍历最接近父DIV与所需的类:

var objhasx = $('#x').closest('.my-class'); 
0

按照您最初的技术:

$(".my-class").each(function() { 
    var $this = $(this); 
    // method 1 
    if ($this.find("#x").length > 0) { 
     // use $this 
    } 
    // method 2 
    if ($this.find("[id='x']").length > 0) { 
     // use $this 
    } 
}); 

更多@

+1

'size()'在jQuery 1.8中被弃用。用长度代替 –

+0

谢谢!不知道。我也会相应地更新我的答案 –

相关问题