Интерфейс HTMLAllCollection используется для устаревшего атрибута document.all. Он работает аналогично HTMLCollection; основные отличия заключаются в том, что он допускает ошеломляющее разнообразие различных (ab) применений своих методов, чтобы все в конечном итоге что-то возвращали, и что его можно вызывать как функцию в качестве альтернативы доступу к свойствам.
Все объекты HTMLAllCollection укоренены в документе Document и имеют фильтр, который соответствует всем элементам, поэтому элементы, представленные коллекцией объекта HTMLAllCollection, состоят из всех элементов-потомков корневого документа.
Объекты, реализующие интерфейс HTMLAllCollection, являются устаревшими объектами платформы с дополнительным внутренним методом [[Call]], описанным в разделе ниже. У них также есть внутренний слот [[IsHTMLDDA]].
Объекты, реализующие интерфейс HTMLAllCollection, ведут себя несколько необычно из-за того, что у них есть внутренний слот [[IsHTMLDDA]]:
- Абстрактная операция приведения к логическому типу ToBoolean в JavaScript возвращает false, если заданы объекты, реализующие интерфейс HTMLAllCollection.
- Алгоритм Сравнения Абстрактного Равенства при заданных объектах, реализующих интерфейс HTMLAllCollection, возвращает значение true при сравнении с undefined и null значениями. (Сравнения с использованием алгоритма Сравнения Строгого Равенства и сравнения Абстрактного Равенства с другими значениями, такими как строки или объекты, не затрагиваются.)
- Оператор typeof в JavaScript возвращает строку «undefined» при применении к объектам, реализующим интерфейс HTMLAllCollection.
Это особое поведение мотивировано стремлением к совместимости с двумя классами устаревшего контента: один использует наличие document.all как способ обнаружения устаревших пользовательских агентов, а другой поддерживает только эти устаревшие пользовательские агенты и использует document.all. объекта без предварительной проверки на его наличие. [JAVASCRIPT]
[Exposed=Window, LegacyUnenumerableNamedProperties] interface HTMLAllCollection { readonly attribute unsigned long length; getter Element (unsigned long index); getter (HTMLCollection or Element)? namedItem(DOMString name); (HTMLCollection or Element)? item(optional DOMString nameOrIndex); // Примечание: Объекты HTMLAllCollection имеют собственный внутренний метод [[Call]] и внутренний слот [[IsHTMLDDA]]. };
Поддерживаемые индексы свойств объекта определены для объектов HTMLCollection.
Имена поддерживаемых свойств состоят из непустых значений всех атрибутов id всех элементов, представленных коллекцией, и непустых значений всех атрибутов name всех элементов с именами «все», представленных коллекцией, в древовидном порядке, игнорируя более поздние дубликаты, с идентификатором id элемента, предшествующим его имени name, если он вносит оба вклада, они отличаются друг от друга, и ни один из них не является дубликатом более ранней записи.
Шаги получателя длины length должны возвращать количество узлов, представленных коллекцией.
Получатель индексированного свойства должен возвращать результат получения элемента с индексом «all» из этого объекта контекста (this) с учетом переданного индекса.
Шаги метода namedItem(name) должны вернуть результат получения элемента(ов) с именем «all» из этого объекта контекста (this) заданного имени name.
Шаги метода item(nameOrIndex):
1. Если nameOrIndex не был указан, верните null. 2. Возвращает результат получения "all" индексированных или именованных элементов из этого объекта контекста (this), заданного nameOrIndex.
Следующие элементы являются элементами с именами «все» («all»-named elements): a, button, embed, form, frame, frameset, iframe, img, input, map, meta, object, select и textarea.
Чтобы получить элемент с индексом «все» (get the «all»-indexed element) из коллекции HTMLAllCollection collection с заданным индексом index, верните индексный элемент index в коллекции collection или значение null, если такого индексного элемента index нет.
Чтобы получить элемент (элементы) с именем «все» (get the «all»-named element(s)) из коллекции HTMLAllCollection collection с заданным именем name, выполните следующие действия:
1. Если name - пустая строка, вернуть null. 2. Пусть subCollection будет объектом HTMLCollection, корнем которого является тот же Document, что и коллекция collection, чей фильтр соответствует только элементам, которые: элементы с именем «все», с атрибутом name, равным name, или, элементы с идентификатором, равным имени name. 3. Если в subCollection есть ровно один элемент, верните этот элемент. 4. В противном случае, если subCollection пуста, вернуть null. 5. В противном случае вернуть subCollection.
Чтобы получить «все» индексированные или именованные элементы (get the «all»-indexed or named element(s)) из коллекции HTMLAllCollection collection с заданным nameOrIndex:
1. Если nameOrIndex, преобразованное в значение строки JavaScript, является именем свойства индекса массива, вернуть результат получения элемента с индексом «все» из коллекции collection с учетом числа, представленного nameOrIndex. 2. Вернуть результат получения элемента(ов) с именем "все" из коллекции collection с заданным nameOrIndex.
[[Call]] ( thisArgument, argumentsList )
1. Если размер argumentsList равен нулю, или если argumentsList[0] не определен - является undefined, вернуть значение null. 2. Пусть nameOrIndex будет результатом преобразования argumentsList[0] в DOMString. 3. Пусть result будет результатом получения "всех" индексированных или именованных элементов из этой HTMLAllCollection с заданным nameOrIndex. 4. Вернуть результат преобразования result в значение ECMAScript.
thisArgument игнорируется, поэтому такой код, как Function.prototype.call.call(document.all, null, «x»), по-прежнему будет искать элементы. (document.all.call не существует, так как document.all не наследуется от Function.prototype.)
Информационные ссылки
Стандарт HTML — Раздел «2.6.2.1 The HTMLAllCollection interface» — https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#the-htmlallcollection-interface