ForEach метод Node.childNodes?

После предоставления неверного ответа относительно свойства .item() Node.childNodes для вопроса, я проверил __proto__ возвращаемого элемента childNodes элемента form и нашел метод forEach.

Метод forEach Node.childNodes не описан в спецификации NodeList, в Methods в MDN или Interface NodeList, и не кажется упомянутый в Итерировать NodeList, используя метод forEach или страницы, связанные с этим Вопросом; хотя он доступен в Chromium 50.

Доступен ли метод только в относительно недавних версиях Chrome/Chromium? Если да, то это документировано?

Есть ли какая-либо документация относительно метода forEach() Node.childNodes?


document.querySelector("form").addEventListener("submit", function(e) {
  e.preventDefault();
  var form = e.target;
  form.childNodes.forEach(function(el) {
    if (el.tagName === "INPUT" && el.type !== "submit")
      snippet.log("name:" + el.name + ", value:" + el.value)
  });
});
<form>
  <input type="text" name="firstName" value="The first name">
  <input type="text" name="lastName" value="The last name">
  <input type="email" name="emailAddress" value="[email protected]">
  <br>
  <input type="submit" value="Submit">
</form>
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Ответ 1

DOM4 теперь определяет NodeList как итерируемый:

iterable<Node>;

Согласно проекту interface можно объявить итерабельным, используя итеративная декларация (сопоставление Iterable) в теле интерфейса.

iterable<value-type>;
iterable<key-type, value-type>;

Объекты, реализующие интерфейс, объявленный как итерируемый поддержка повторяется для получения последовательности значений.

Примечание. В языковой привязке ECMAScript используется интерфейс, который   iterable будет иметь "записи", "forEach", "keys", "values" и   @@iterator свойства объект прототипа интерфейса.

Если задан параметр одного типа, то интерфейс имеет значение iterator и предоставляет значения указанного типа.

Ответ 2

Доступен ли метод только в относительно недавних версиях Chrome/Chromium? Если да, то это документировано?

Да, это новое в DOM4, поэтому оно не широко доступно.

Есть ли какая-либо документация относительно метода forEach() для Node.childNodes?

Смотрите Добавьте поддержку для [ArrayClass] и используйте ее в NodeList в трекере Chromium:

От https://bugs.webkit.org/show_bug.cgi?id=81573

http://dom.spec.whatwg.org/#interface-nodelist

DOM4 специфицирует NodeList как имеющий Array.prototype в своей цепочке прототипов.

Еще немного фона для этого. [ArrayClass] позволяет нам делать такие вещи, как document.querySelectorAll('. Foo'). ForEach и т.д. Патч на bugs.webkit.org имеет флаг времени выполнения, потому что неясно, будет ли это еще возможно.

Исторически эти объекты, подобные массиву, не включали эти методы из прототипа массива, что приводило к коду типа Array.prototype.forEach.call(nodeList, function() { ... }). Теперь это предназначено для изменения в DOM4.