我已经看到有关使用jQuery选择第一个子元素的最快方法的讨论。可以预期的是,本机DOM firstChild属性比使用jQuery选择器或选择器组合要快得多 – 参见
http://jsperf.com/jquery-first-child-selection-performance/6.这通常不是问题 – 它被用于性能不是很大的地方,或者很容易访问DOM元素并使用它的.firstChild属性。但是,这有几个问题:
> firstChild可以返回文本或注释节点,而不是一个元素,因为jQuery选择器将返回
>如果我需要选择多个元素的第一个子元素,我必须使用一个缓慢的选择器,或者去复制DOM元素的大量额外的工作,将它们添加到一个集合中,然后将它们放回到一个jQuery对象中。
在我看来,将firstChild方法添加到核心jQuery库中的成本将远远小于其优点。我自己拍摄了创建这样一种方法来自己使用:
$.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中包含这样的功能?
解决方法
“Why does jQuery not provide a .firstChild method?”
特征蠕变,最有可能。
可以使用您所说的其他方法来完成,如果执行性能是一个问题,您可以根据需要扩展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); };