为什么jQuery不提供.firstChild方法?

前端之家收集整理的这篇文章主要介绍了为什么jQuery不提供.firstChild方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经看到有关使用jQuery选择第一个子元素的最快方法的讨论。可以预期的是,本机DOM firstChild属性比使用jQuery选择器或选择器组合要快得多 – 参见 http://jsperf.com/jquery-first-child-selection-performance/6.这通常不是问题 – 它被用于性能不是很大的地方,或者很容易访问DOM元素并使用它的.firstChild属性。但是,这有几个问题:

> firstChild可以返回文本或注释节点,而不是一个元素,因为jQuery选择器将返回
>如果我需要选择多个元素的第一个子元素,我必须使用一个缓慢的选择器,或者去复制DOM元素的大量额外的工作,将它们添加到一个集合中,然后将它们放回到一个jQuery对象中。

在我看来,将firstChild方法添加到核心jQuery库中的成本将远远小于其优点。我自己拍摄了创建这样一种方法来自己使用:

  1. $.fn.firstChild = function() {
  2. var ret = [];
  3.  
  4. this.each(function() {
  5. var el = this.firstChild;
  6.  
  7. //the DOM firstChild property could return a text node or comment instead of an element
  8. while (el && el.nodeType != 1)
  9. el = el.nextSibling;
  10.  
  11. if (el) ret.push(el);
  12. });
  13.  
  14. //maintain jQuery chaining and end() functionality
  15. return this.pushStack(ret);
  16. };

在我在http://jsperf.com/jquery-multiple-first-child-selection创建的测试中,该功能比任何其他选项快五倍以上。测试基于上述测试,但是选择多个元素的第一个子元素,而不是单个元素。

有没有我失踪的东西?我应该使用的技术?或者这是一个不应该担心的问题吗?是否有理由不在jQuery中包含这样的功能

解决方法

“Why does jQuery not provide a .firstChild method?”

特征蠕变,最有可能。

可以使用您所说的其他方法来完成,如果执行性能是一个问题,您可以根据需要扩展jQuery。

您可以更好地提高代码性能

  1. $.fn.firstChild = function () {
  2. var ret = [];
  3. // use a for loop
  4. for (var i = 0,len = this.length; i < len; i++) {
  5. var this_el = this[i],el = this_el.firstElementChild; // try firstElementChild first
  6. if (!el) {
  7. el = this_el.firstChild;
  8. while (el && el.nodeType != 1)
  9. el = el.nextSibling;
  10. }
  11. if (el) ret.push(el);
  12. }
  13. //maintain jQuery chaining and end() functionality
  14. return this.pushStack(ret);
  15. };

猜你在找的jQuery相关文章