为什么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库中的成本将远远小于其优点。我自己拍摄了创建这样一种方法来自己使用:

$.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);
};

猜你在找的jQuery相关文章