我正在尝试填充Element.prototype.children
,这应该返回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的反馈
答案 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