NodeList.prototype.forEach = Array.prototype.forEach;

Видите ли вы какие-либо проблемы со следующим:

NodeList.prototype.forEach = Array.prototype.forEach;

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


person Web_Designer    schedule 07.03.2013    source источник
comment
Мне понравилась эта идея .. Жду, если другие укажут на какие-либо проблемы в ней.   -  person Salman    schedule 07.03.2013
comment
Ознакомьтесь с NodeList.js.   -  person Edwin Reynoso    schedule 08.08.2015


Ответы (4)


Часто не рекомендуется расширять функциональность DOM с помощью прототипов, особенно в старых версиях IE (статья ).

Однако вы можете просто использовать Array.prototype.forEach, даже не добавляя его в цепочку прототипов и не преобразовывая NodeList в массив:

var list = document.querySelectorAll(".some.query");
Array.prototype.forEach.call(list, function(el){ /* ... */ });

/* or */
var forEach = function(ctn, callback){
    return Array.prototype.forEach.call(ctn, callback);
}
forEach(list, function(el){ /* ... */ });

См. также MDN: Почему я не могу использовать forEach или map на NodeList.

person Zeta    schedule 07.03.2013
comment
есть так много функций JS, которые отлично работали бы, если бы не старые версии IE... - person Alnitak; 07.03.2013
comment
@MuhammadUmer: Пожалуйста, не задавайте вопросы в комментариях. Если бы я больше не был активен в StackOverflow, вы бы никогда не получили ответа. При этом thisArg – это значение this во время callback, не во время Array.prototype.forEach. - person Zeta; 12.09.2014
comment
Вопрос задан, спасибо за время... если вы хотите объяснить больше, сделайте это. foreach-call-vs-array-prototype-for" title="в чем разница между прототипом массива foreach call и прототипом массива для"> stackoverflow.com/questions/25801934/ - person Muhammad Umer; 12.09.2014
comment
К сожалению, этот подход не работал у меня для узлов XML-документа, т.е. полученных через XMLHttpRequest или с помощью jQuery $.get("/test.xml", function(xmlDocument) { Array.prototype.forEach.call(xmlDocument.childNodes, function(node) {...}); });. Однако решение из этот пост работает нормально: Array.from(xmlDocument.childNodes).forEach(function(node) {...});. Для узлов документа DOM работает нормально: NodeList.prototype.forEach = Array.prototype.forEach; document.childNodes.forEach(function(node) { ... });. ФФ v45, Хром v53. - person dma_k; 06.03.2018

Если вы работаете над библиотекой, которая будет использоваться другими людьми, то делать это не рекомендуется.

Если это просто ваш собственный код (т.е. веб-сайт), то, думаю, в этом нет ничего страшного. Вам, вероятно, следует охранять его, потому что в будущем браузеры будут поддерживать NodeList.prototype.forEach изначально (Chrome уже поддерживает).

if (!NodeList.prototype.forEach) {
  NodeList.prototype.forEach = Array.prototype.forEach;
}
person DaveJ    schedule 28.08.2016

Как упоминал Зета, было бы лучше использовать функцию удобства. Эта версия, однако, позволит вам придать ей контекст.

var forEach = function(list, callback, context){
  return Array.prototype.forEach.call(list, callback, context);
};
person Dave Arel    schedule 03.12.2013

NodeList.prototype.forEach() теперь доступен в большинстве браузеров: https://developer.mozilla.org/fr/docs/Web/API/NodeList/forEach

Таблица совместимости браузеров: https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Browser_Compatibility

person Nicolas Hoizey    schedule 24.06.2020