首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么jQuery不提供.firstChild方法?

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

Stack Overflow用户
提问于 2012-04-11 08:34:45
回答 2查看 3.3K关注 0票数 16

我已经看到很多关于使用jQuery选择第一个子元素的最快方法的讨论。不出所料,原生DOM firstChild属性比使用jQuery选择器或选择器组合要快得多--参见http://jsperf.com/jquery-first-child-selection-performance/6。这通常不是问题--要么是在性能不是大问题的地方使用它,要么是访问DOM元素并使用它的.firstChild属性很容易。然而,这有几个问题:

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

在我看来,向核心jQuery库添加firstChild方法的成本将远远小于收益。为了自己的使用,我尝试创建了这样一个方法:

代码语言:javascript
复制
$.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中包含这样的函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 09:38:49

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

功能爬行,最有可能。

正如您所说的,它可以使用其他方法来完成,如果性能是一个问题,您可以像您所做的那样扩展jQuery以满足特定的需求。

你可以在你的代码中提高一点性能...

代码语言:javascript
复制
$.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);
};
票数 12
EN

Stack Overflow用户

发布于 2012-04-11 09:59:52

对于单个元素的情况,您可以使用

代码语言:javascript
复制
$('.test > eq(0)')

它的速度似乎和你的差不多..

http://jsperf.com/jquery-multiple-first-child-selection/2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10098367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档