jQuery - 选择不在某个ID内的元素

4
我如何选择所有具有“title”属性但不包含在具有“#boo” ID的元素中的元素?
例如,$(“*[title]”)。each()...,但不包括位于#boo中的元素 :)

如果你使用$('div#boo')或类似的代码,你在这里会被喊叫的。 - qwertymk
1
因为当您使用id选择器(#)时,它会更快,因为浏览器本身只需获取正确的元素,而无需先筛选所有div。虽然我相当确定jQuery会自动将其转换为仅为Id选择器。 - qwertymk
@quertymk: 我之前也不知道这个。通常我会尽可能具体地使用ID,比如div#boo而不是#boo,因为你应该知道它们用在哪里,它们不像类那么开放...但从现在开始我会记住这个的。 - sevenseacat
6个回答

9
$("[title]").not("#boo [title]").each()

演示

另外,当您在获取元素时使用id时,如果不给元素的标签加前缀,则速度会更快。例如,只需使用#boo而不是div#boo演示 <-- 尝试查看firebug控制台中的时间比较。


我谦卑地向您的l33t3r代码提交。您是更伟大的忍者。 - qwertymk
如果可以的话,我会再次点赞id only vs tag + id演示。干得好。编辑:Loophole,你有评论。 - qwertymk

6

$('*:not(#boo) *[title]'); 应该可以工作。


有趣的方法 :) 我怀疑它不是很高效,但肯定是一种不同的思考方式。 - Phrogz
我的大脑在CSS选择器方面比在Javascript方面思考得更好...我更喜欢Reigel的答案,但我想加入自己的看法。 - sevenseacat
@Phrogz,实际上我怀疑如果#boo的结构很深的话,它可能会更有效率。 - David Tang
@Box9:我的直觉告诉我,这将在页面上找到_每个_元素(除了#boo),然后对每个元素调用getElementsByTagName('*')。也许Sizzle比这聪明。 - Phrogz
这似乎对于 querySelectorAll 是有效的。这是一个很大的优势。 - user113716
最快的解决方案:http://jsperf.com/element-not-within-another 但是...它不起作用:http://jsfiddle.net/93ckoeos/ - Fabian Horlacher

3
$('[title]').filter(function(){return $(this).parents('#boo').length === 0;})

2

2

有很多方法可以解决这个问题。以下是另外两种方法:

$('[title]:not(#boo *[title])');
$('[title]').not('#boo *[title]');

1

我以前也遇到过这种情况,使用了类似以下的方法:

$(":not(#boo) > [title]")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接