HTML标记:
<div>
<a id="foo"> </a>
</div>
jQuery:
$('div').each(function(){
$('#foo', this).dosmth(); // 1
$('#foo').dosmth(); // 2
});
哪种方法在运行
dosmth
时会更快?HTML标记:
<div>
<a id="foo"> </a>
</div>
jQuery:
$('div').each(function(){
$('#foo', this).dosmth(); // 1
$('#foo').dosmth(); // 2
});
dosmth
时会更快?$("div").each
部分,直接执行$("#foo")
。因为foo
是一个ID,所以查找是瞬间完成的。$("#foo")
。注意,你也不想这样做,因为它会为页面上的每个div执行函数(因此在具有大量div的较大文档上,这将是最慢的)。$("#foo", this)
。上下文节点本来就没有用处,还要考虑到jQuery会首先将this
构建成一个jQuery对象,并将其转换为$(this).find("#foo")
。当然,这都是不必要的。底线:在大多数情况下(例如有时确认ID是否在一个上下文中而不是另一个上下文中),使用上下文节点进行ID查找是不必要的。
以下是来自jQuery源代码的一些资源:$("#id")
被单独处理为document.getElementById
find
- 当你传递一个上下文时会发生什么由于在DOM中,#id
应该是唯一的,所以您的标记将无效(我假设您使用.each()
基于超过一个<div/>
)
将ID更改为类并使用以下内容:
<div>
<a class="foo"> </a>
</div>
<div>
<a class="foo"> </a>
</div>
脚本
$('div').each(function(){
$('.foo', this).dosmth(); //or $(this).find(".foo");
});
但是如果你只有一个id为foo
的元素,使用id选择器会更快,并且你可以省略使用.each()
$('#foo').dosmth(); //or document.getElementById("foo");
仅通过id选择器来进行jQuery搜索是最快的方式,因为它使用了JavaScript中的getElementbyId方法。
因此,这是最快的方法:
$('#foo').dosmth();
$('#foo', this).dosmth();
它被翻译成:
$(this).find('#foo').dosmth();
这样做会造成另一个无用的操作,因为你的 #foo 是唯一的。
敬礼,
Max
I would go with
$('a#foo', this).dosmth();
Update But instead of retrieving all the divs before, I would check for only the desired one at the first time like this
$('div a#foo').each(function(){ }
document.getElementById('foo')
。我不知道jQuery是如何实现的,但认为在这种情况下使用getElementById是很合理的。我甚至认为第一种方法更慢,因为jQuery需要测试“this”上下文。 - Karolis$('#foo').dosmth();
是最快的方法 :) 但我还没有测试过。这只是我的想法。 - Karolisdocument.getElementById
,而是基于 this
构建一个 jQuery 对象,然后运行 $(this).find("a#foo")
,它会在 $(this)
中搜索 <a>
标签,然后使用 getElementById
在这些 <a>
标签中进行搜索。 - brymck$('#foo', this).dosmth();
这将在 div
上下文中搜索,而不是整个 DOM,这将使选择器更快。这只有在 DOM 很大时才有意义,否则,只需使用正常的选择器:$('#foo').dosmth();
如果你使用id,那么只会有一个元素。所以你可以直接使用:
$('a#foo').dosmth();
你不需要使用each()来遍历每个div并获取其中的所有a#foo元素。这样做会浪费时间,没有必要创建循环。相反,请使用:
$('a#foo').each(function(){ ... });
或者甚至可以只用:
$('a#foo').dosmth();
如果你想的话,也可以这样做:$('div a#foo').dosmth();