13.11.2011, 23:43
|
Новичок на форуме
|
|
Регистрация: 13.11.2011
Сообщений: 3
|
|
Помогите прикрутить forEach к HTMLCollection и NodeList
Есть задача — заставить работать такой кусок кода:
Код:
|
var elements = document.getElementsByTagName(someName);
elements.forEach(someFunction); |
Достаточно решения в современных браузерах, где поддерживается «родной» forEach для обычных массивов. Кроме того, нужно решение на чистом JavaScript + DOM, без jQuery и других библиотек.
Я нашёл весьма кривое и топорное решение задачи. Надеюсь, что здесь мне подскажут более прямое.
Вот что я сделал:
// Это для 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);
}
}
После этого требуемый кусок кода работает. Однако, для начала, мне не нравится дикое дублирование кода. Хочется свернуть две конструкции в одну, но я путаюсь с тем, как передавать параметры туда-сюда.
Затем, я предполагаю, что моё решение может оказаться в принципе неграмотным и непрофессиональным, а настоящие специалисты решали бы эту задачу как-нибудь совсем по-другому.
Помогите разобраться, пожалуйста.
|
|
14.11.2011, 00:01
|
Новичок на форуме
|
|
Регистрация: 13.11.2011
Сообщений: 3
|
|
Спасибо за быстрый ответ.
Боюсь, я не очень понимаю, что значит «наполнить прототип массива DOM-нодами». Я не профессиональный программист, и немного теряюсь. Если не сложно, поясните, пожалуйста; лучше с примером кода.
|
|
14.11.2011, 00:30
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Сообщение от observer
|
Наполните его DOM-нодами и работайте с ним.
|
Причём здесь "DOM-ноды"?
Парень, а что ты с ником сделал? Я его не вижу... Ладно, неважно. Про прототипы и ООП-модель JavaScript в целом можно (и нужно, а то ничего не поймёте) почитать тут.
|
|
14.11.2011, 01:36
|
Аспирант
|
|
Регистрация: 11.11.2011
Сообщений: 96
|
|
Сообщение от trikadin
|
Причём здесь "DOM-ноды"?
|
In the HTML DOM, each node is an object.
Objects have methods and properties that can be accessed and manipulated by JavaScript.
|
|
14.11.2011, 01:51
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
observer, не тупите. То, что все кошки - животные, ещё не значит, что все животные - кошки. То, что каждая нода в DOM'е - объект, ещё не означает, что все объекты можно называть DOM-нодами.
И уж тем более, DOM-нодами нельзя назвать методы объекта, записанные к нему в прототип.
P. S. Почему не по-русски, кстати?
|
|
14.11.2011, 02:27
|
Аспирант
|
|
Регистрация: 11.11.2011
Сообщений: 96
|
|
Сообщение от trikadin
|
То, что каждая нода в DOM'е - объект, ещё не означает, что все объекты можно называть DOM-нодами.
|
А кто назвал все объекты DOM-узлами?
Сообщение от trikadin
|
И уж тем более, DOM-нодами нельзя назвать методы объекта, записанные к нему в прототип.
|
Я такое написал, правда?
Сообщение от trikadin
|
P. S. Почему не по-русски, кстати?
|
Цитата. Перевод тут не к чему. И так все ясно.
Я написал ровно то, что я написал. Собираем узлы (по селектору, как угодно). Push-им в массив. Работаем с массивом через свойство прототипа forEach.
[document.documentElement, document.getElementsByTagName('a')[0]].forEach(addEvilAttrToElement);
Если вы не поняли ни слова, это ваши проблемы.
|
|
14.11.2011, 02:37
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Сообщение от observer
|
Работайте с прототипом массива. Наполните его DOM-нодами и работайте с ним.
|
Вы написали так (я убрал ссылку). Значение этой фразы: "наполните прототип массива (а не массив, как вы теперь утверждаете) DOM-нодами и работайте с ним (с прототипом, опять же )"
Сообщение от observer
|
Если вы не поняли ни слова, это ваши проблемы.
|
Скорее, это стало проблемой того парня, которому вы подсказывали. Это ярко подтверждается его следующим сообщением: "я не очень понимаю, что значит «наполнить прототип массива DOM-нодами»"
И кстати, неумение понятно объясняться и строить связный текст - это именно ваша очень большая проблема.
Сообщение от observer
|
Я написал ровно то, что я написал.
|
Это иллюзия, простите. Вам так только кажется.
P. S. Если уж цитата, то хоть источник цитирования указывайте))
|
|
14.11.2011, 02:52
|
Новичок на форуме
|
|
Регистрация: 13.11.2011
Сообщений: 3
|
|
Сообщение от observer
|
Собираем узлы (по селектору, как угодно). Push-им в массив.
|
Допустим, у нас есть коллекция, полученная в результате document.getElementsByTagName(element).
Можно ли превратить её в массив, не используя явный цикл со счётчиком? То есть, без всяких первобытных конструкций вроде for(var i = 0; i < коллекция.length; i++)?
Если скатиться к ручному перебору, то исходная задача теряет смысл. Идея была как раз в том, чтобы для перебора элементов использовать именно forEach, а не искусственные итераторы.
Последний раз редактировалось , 14.11.2011 в 02:55.
Причина: Форматирование
|
|
14.11.2011, 02:58
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Можно попробовать так. Но не факт, что сработает)
list= document.getElementsByTagName("div");
arr= [];
arr.push.apply(arr, list);
|
|
|
|