我已经看到很多关于使用jQuery选择第一个子元素的最快方法的讨论。不出所料,原生DOM firstChild属性比使用jQuery选择器或选择器组合要快得多--参见http://jsperf.com/jquery-first-child-selection-performance/6。这通常不是问题--要么是在性能不是大问题的地方使用它,要么是访问DOM元素并使用它的.firstChild属性很容易。然而,这有几个问题:
在我看来,向核心jQuery库添加firstChild方法的成本将远远小于收益。为了自己的使用,我尝试创建了这样一个方法:
$.fn.firstChild = function() {
var ret = [];
this.each(function() {
var el = this.firstChild;
//the DOM firstChild property could return a text node or comment instead of an element
while (el && el.nodeType != 1)
el = el.nextSibling;
if (el) ret.push(el);
});
//maintain jQuery chaining and end() functionality
return this.pushStack(ret);
};
在我在http://jsperf.com/jquery-multiple-first-child-selection创建的测试中,这个函数的执行速度比其他任何选项都快五倍以上。这些测试基于上面提到的测试,但选择的是多个元素的第一个子元素,而不是单个元素。
我是不是漏掉了什么?一种我应该使用的技术?或者这是一个人们永远不应该担心的问题?有没有理由不在jQuery中包含这样的函数?
发布于 2012-04-11 09:38:49
“为什么jQuery不提供.firstChild方法?”
功能爬行,最有可能。
正如您所说的,它可以使用其他方法来完成,如果性能是一个问题,您可以像您所做的那样扩展jQuery以满足特定的需求。
你可以在你的代码中提高一点性能...
$.fn.firstChild = function () {
var ret = [];
// use a for loop
for (var i = 0, len = this.length; i < len; i++) {
var this_el = this[i],
el = this_el.firstElementChild; // try firstElementChild first
if (!el) {
el = this_el.firstChild;
while (el && el.nodeType != 1)
el = el.nextSibling;
}
if (el) ret.push(el);
}
//maintain jQuery chaining and end() functionality
return this.pushStack(ret);
};
发布于 2012-04-11 09:59:52
对于单个元素的情况,您可以使用
$('.test > eq(0)')
它的速度似乎和你的差不多..
https://stackoverflow.com/questions/10098367
复制相似问题