创建一个HTMLCollection

时间:2011-10-13 12:40:32

标签: javascript dom dom4

我正在尝试填充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

除了填充HTMLCollection之外还有什么方法可以与它互动吗?

如果您可以提出解决方案,还可以提供有关this github issue的反馈

4 个答案:

答案 0 :(得分:5)

不要指望主机对象的行为类似于(ECMAScript)本机对象,它们是完全不同的东西。有些浏览器确实实现了像ECMAScript对象这样的DOM对象,但它不是必需的,不应该依赖它们。请注意,大多数HTML集合都是实时的,很难在本机对象中模拟它。

答案 1 :(得分:5)

我将如何做到这一点:

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;
    }
};

其中arr是一个常规数组,其中包含应该位于HTMLCollection内的所有DOM元素。

待办事项列表:

  • 应事先检查参数arr:它是一个数组吗?是否是该数组DOM元素的所有元素?

答案 2 :(得分:1)

我知道这是一个较旧的问题,但我遇到了类似的需要创建一个空的HTMLCollection我只是通过创建一个元素,然后使用元素中不存在的类对它运行getElementsByClassName()来实现它

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

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

答案 3 :(得分:1)

我认为这是创建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