создать HTMLCollection - PullRequest
       13

создать HTMLCollection

8 голосов
/ 13 октября 2011

Я пытаюсь подобрать 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 есть ли способ с ним взаимодействовать?

Также предоставьте отзыв по этой проблеме github , если вы можете предложить решение

Ответы [ 3 ]

5 голосов
/ 13 октября 2011

Вот как я бы это сделал:

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 - это обычный массив, содержащий все элементы DOM, которые должны быть внутри HTMLCollection.

Список дел:

  • аргумент arr должен быть проверен заранее: это массив?Все ли элементы этого массива являются DOM-элементами?
5 голосов
/ 13 октября 2011

Не ожидайте, что хост-объекты будут вести себя как (ECMAScript) нативные объекты, это совершенно разные вещи. Некоторые браузеры реализуют свои объекты DOM, такие как объекты ECMAScript, но это не обязательно и на них нельзя полагаться. Обратите внимание, что большинство HTML-коллекций являются живыми, очень трудно эмулировать это в собственном объекте.

1 голос
/ 14 ноября 2017

Я знаю, что это старый вопрос, но я столкнулся с аналогичной необходимостью создать пустую коллекцию HTMLCollection, и я сделал это, просто создав элемент и затем запустив для него метод getElementsByClassName (), используя класс, который не существует в элементе .

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

Возвращает пустой объект HTMLCollection.

...