13

我正在尝试填充Element.prototype.children应该返回HTMLCollection

有一个window.HTMLCollection

然而

var h = new HTMLCollection();
//TypeErrror: HTMLCollection is not a constructor

var h = Object.create(HTMLCollection.prototype);
h[0] = div;
h.item(0); 
// Could not convert JavaScript argument

测试 Firefox 7 和 Chrome

除了 shimming HTMLCollection,还有什么方法可以与之交互吗?

如果您可以提出解决方案,还请提供有关此 github 问题的反馈

4

4 回答 4

9

我认为这是创建由浏览器处理的 HTMLCollection 的正确方法。

var docFragment = document.createDocumentFragment();
docFragment.appendChild(node1);
docFragment.appendChild(node2);
var myHTMLCollection = docFragment.children;

参考:

https://stackoverflow.com/a/35969890/10018427

https://developer.mozilla.org/en-US/docs/Web/API/NodeList

https://developer.mozilla.org/en-US/docs/Web/API/HTMLCollection

https://www.w3schools.com/js/js_htmldom_nodelist.asp

于 2019-11-28T16:01:39.467 回答
7

这是我的做法:

function MyHTMLCollection( arr ) {
    for ( var i = 0; i < arr.length; i += 1 ) {
        this[i] = arr[i];
    }

    // length is readonly
    Object.defineProperty( this, 'length', {
        get: function () {
            return arr.length;
        }
    });

    // a HTMLCollection is immutable
    Object.freeze( this );
}

MyHTMLCollection.prototype = {
    item: function ( i ) {
        return this[i] != null ? this[i] : null;
    },
    namedItem: function ( name ) {
        for ( var i = 0; i < this.length; i += 1 ) {
            if ( this[i].id === name || this[i].name === name ) {
                return this[i];
            }
        }
        return null;
    }
};

wherearr是一个常规数组,其中包含应该在 HTMLCollection 中的所有 DOM 元素。

待办事项清单:

  • arr应该事先检查参数:它是一个数组吗?该数组的所有元素都是 DOM 元素吗?
于 2011-10-13T13:18:47.760 回答
6

不要期望宿主对象表现得像(ECMAScript)本机对象,它们是完全不同的东西。一些浏览器确实实现了它们的 DOM 对象,如 ECMAScript 对象,但它不是必需的,也不应该依赖。请注意,大多数 HTML 集合都是实时的,很难在本机对象中模拟它。

于 2011-10-13T12:53:17.913 回答
2

我知道这是一个较老的问题,但我遇到了创建一个空 HTMLCollection 的类似需求,我通过简单地创建一个元素然后使用元素中不存在的类对其运行 getElementsByClassName() 来做到这一点。

document.createElement("div").getElementsByClassName('noClassHere');

这将返回一个空的 HTMLCollection 对象。

于 2017-11-14T17:02:42.150 回答