2011-06-16 55 views
1

在jQuery中,我已经知道如何通过使用由特定选择器返回的jQuery对象的length属性来检查元素是否存在。jQuery优化:快速检查元素是否存在?

但是,在内部,这意味着jQuery首先抓取所有对象,然后获取长度。出于性能方面的原因,我想看看是否只有1个元素存在,我不需要抢别人。

我该怎么做?

+0

选择给它分配一个ID或类做到这一点。并单独获取该课程。 – MarioRicalde 2011-06-16 18:44:18

+1

如果您可以通过提供一个应该加快速度的环境来缩小范围。 – ExtraGravy 2011-06-16 18:53:32

+1

我不知道为什么这是被拒绝的。 – 2013-05-04 14:39:00

回答

1

见相关的问题:Optimize jQuery selector with :first

我分出一个jsPerf测试与$("xxx").first()比较$("xxx:first"),看看jQuery的优化,从当使用:first匹配早期保释出来。它似乎并不被具有优化:

http://jsperf.com/does-first-boost-your-selector/4

更新:.eq(0) VS :eq(0)的工作方式。

所以,你可能运气不好。似乎没有更有效的方式来选择/检查第一场比赛。除非当然,除了其他人已经注意到的,你可以选择将选择器限制到类和标识符,并且在另一个我连接的问题中也已经注意到了。

+0

在对[@ Ryan的回答](http://stackoverflow.com/questions/6376923/jquery-optimization-check-if-an-element-exists-fast/6376984#6376984)进行评论时,我发现[jQuery支持](http://api.jquery.com/first-selector/)你的结论是:'first'没有帮助。他们实际上建议做一个纯粹的CSS选择器,后面加上'.filter(“:first”)',因为':first'不受本地DOM方法的帮助。 – patridge 2011-06-16 19:49:28

0

我不确定这是否提高了性能,但您可以使用选择器过滤仅返回第一个匹配的元素。尝试这个?

var exists = !$("selector:eq(0)").length == 0; 
+0

如果反对是因为我错了,那么请纠正我,让我知道我错了。谢谢! – Ryan 2011-06-16 19:01:27

+0

你最初的回答(在你编辑之前)没有回答这个问题。现在它是。 – 2011-06-16 19:13:14

+0

第一:我没有downvote。根据[文档](http://api.jquery.com/first-selector/)':first'相当于':eq(0)'。它还说“最佳性能”是通过“使用纯CSS选择器,然后使用'.filter(”:first“)'”来实现的。没有保证,但是这肯定意味着':first'(以及扩展名':eq(0)')不会使任何事情变得快捷。 – patridge 2011-06-16 19:15:07

0

如果元素你可以使用的document.getElementById(ID),这是寻找任何DOM元素最快的方法的ID。

在dom中,您可以使用getElementsByTagName通过标记名称查找元素。

对于所有其他情况下使用JQuery。

document.getElementById(id); 
document.getElementById(id).getElementsByTagName(tag); 
1

当我想检查是否存在未被ID选中的元素,并且性能是一个问题时,我使用document.querySelector()而不是jQuery。

不像querySelectorAll(),querySelector()似乎只选择第一个匹配元素,提供了一种有效的方法来检查元素的存在。

if(document.querySelector('a')){ 
    console.log('This document contains at least one anchor tag!'); 
} 

您还可以通过从一个jQuery对象

var element = $('#super_special_element'); 

if(element.get(0).querySelector('a')){ 
    console.log('Super special element contains at least one anchor tag!'); 
}