Помогите прикрутить forEach к HTMLCollection и NodeList
Есть задача — заставить работать такой кусок кода:
Код:
var elements = document.getElementsByTagName(someName); Я нашёл весьма кривое и топорное решение задачи. Надеюсь, что здесь мне подскажут более прямое. Вот что я сделал: // Это для IE и Firefox: if (HTMLCollection.prototype.forEach === undefined) { HTMLCollection.prototype.forEach = function(callback, thisObj) { Array.prototype.forEach.call(this, callback, thisObj); } } // Это для Chrome: if (NodeList.prototype.forEach === undefined) { NodeList.prototype.forEach = function(callback, thisObj) { Array.prototype.forEach.call(this, callback, thisObj); } } После этого требуемый кусок кода работает. Однако, для начала, мне не нравится дикое дублирование кода. Хочется свернуть две конструкции в одну, но я путаюсь с тем, как передавать параметры туда-сюда. Затем, я предполагаю, что моё решение может оказаться в принципе неграмотным и непрофессиональным, а настоящие специалисты решали бы эту задачу как-нибудь совсем по-другому. Помогите разобраться, пожалуйста. |
Работайте с прототипом массива (https://developer.mozilla.org/en/Jav.../Array/forEach). Наполните его DOM-нодами и работайте с ним.
Не нужно мучать прототипы DOM-интерфейсов. Не дело это. |
Спасибо за быстрый ответ.
Боюсь, я не очень понимаю, что значит «наполнить прототип массива DOM-нодами». Я не профессиональный программист, и немного теряюсь. Если не сложно, поясните, пожалуйста; лучше с примером кода. |
Цитата:
Парень, а что ты с ником сделал? Я его не вижу... Ладно, неважно. Про прототипы и ООП-модель JavaScript в целом можно (и нужно, а то ничего не поймёте) почитать тут. |
Цитата:
In the HTML DOM, each node is an object. Objects have methods and properties that can be accessed and manipulated by JavaScript. |
observer, не тупите. То, что все кошки - животные, ещё не значит, что все животные - кошки. То, что каждая нода в DOM'е - объект, ещё не означает, что все объекты можно называть DOM-нодами.
И уж тем более, DOM-нодами нельзя назвать методы объекта, записанные к нему в прототип. P. S. Почему не по-русски, кстати? |
Цитата:
Цитата:
Цитата:
Я написал ровно то, что я написал. Собираем узлы (по селектору, как угодно). Push-им в массив. Работаем с массивом через свойство прототипа forEach. [document.documentElement, document.getElementsByTagName('a')[0]].forEach(addEvilAttrToElement); Если вы не поняли ни слова, это ваши проблемы. |
Цитата:
Цитата:
И кстати, неумение понятно объясняться и строить связный текст - это именно ваша очень большая проблема. Цитата:
P. S. Если уж цитата, то хоть источник цитирования указывайте)) |
Цитата:
Можно ли превратить её в массив, не используя явный цикл со счётчиком? То есть, без всяких первобытных конструкций вроде for(var i = 0; i < коллекция.length; i++)? Если скатиться к ручному перебору, то исходная задача теряет смысл. Идея была как раз в том, чтобы для перебора элементов использовать именно forEach, а не искусственные итераторы. |
Можно попробовать так. Но не факт, что сработает)
list= document.getElementsByTagName("div"); arr= []; arr.push.apply(arr, list); |
Часовой пояс GMT +3, время: 19:54. |