24.08.2008, 23:40
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
DOMNodeList to Array
Возможно ли выполнить подобное в IE:
var array = [].slice.call(document.body.childNodes);
Странно, почему же тогда код успешно выполняется и в IE с «arguments», который тоже не является «Array»?
(function(a, b, c) {
alert([].slice.call(arguments).length);
})(1, 2, 3);
Последний раз редактировалось Octane, 24.08.2008 в 23:44.
|
|
25.08.2008, 09:29
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Ну arguments, как минимум, является объектом JScript, а DOMNodeList -- объектом DOM.
|
|
25.08.2008, 12:46
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Сообщение от Octane
|
Возможно ли выполнить подобное в IE:
var array = [].slice.call(document.body.childNodes);
Странно, почему же тогда код успешно выполняется и в IE с «arguments», который тоже не является «Array»?
(function(a, b, c) {
alert([].slice.call(arguments).length);
})(1, 2, 3);
|
И что тут удивительного?
Ты вызываешь метод slice пустого массива, передаёшь (смотри формат комманды call) ему arguments, а сартИндекс и ЭндИндекс не передаёшь, соответственно он возвращает НОВЫЙ массив со всеми элементами (с первого по последний), что были в arguments.
|
|
25.08.2008, 12:55
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
ZoNT, вопрос не в том, почему работает с arguments, а в том, почему не работает с DOMNodeList.
|
|
25.08.2008, 12:57
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
потому что аргументс - это почти массив, а домлист - это дом лист...
|
|
25.08.2008, 13:00
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Оригинальный ответ Следовательно, во всех браузерах, кроме ИЕ, DOMNodeList -- это почти массив.
З.Ы. Что за нечеткая логика? Объект или является массивом, или не является, третьего не дано. Ни arguments, ни DOMNodeList массивами не являются.
|
|
25.08.2008, 13:03
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Он не является нигде, просто некоторые браузеры работают с ним по-разному и всё...
Это как парсинг даты: можно написать чтобы он жрал некорректные строки, а можно чётко придерживаться стандарта...
|
|
25.08.2008, 13:33
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от ZoNT
|
Он не является нигде
|
Если бы DOMNodeList являлся массивом, темы бы не было. Вопрос в том, как преобразовать коллекцию в массив без перебора элементов.
|
|
25.08.2008, 13:34
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
я подумаю
Ни разу таким вопросом не задавался...
А оно надо? Помоему перебор - тоже неплохо... А нестандартный способ будет наверняка не быстрее...
Последний раз редактировалось ZoNT, 25.08.2008 в 13:37.
|
|
25.08.2008, 16:07
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от ZoNT
|
смотри формат комманды call
|
Работает же везде без остальных параметров... а в IE ни с параметрами, ни без них, ни с «apply» — вообще никак
Сообщение от ZoNT
|
А оно надо? Помоему перебор - тоже неплохо...
|
«Перебор» — пользовательская функции, мне кажется «slice» будет быстрее А вообще было бы удобно реализовать такую возможность, чтобы не писать отдельную функцию для перевода «DOMNodeList» в «Array», когда требуются методы работы с «Array», например «push». :cool:
p.s. в «jQuery» есть метод «makeArray» (v.1.2.6, line 1129):
makeArray: function( array ) {
var ret = [];
if( array != null ){
var i = array.length;
//the window, strings and functions also have 'length'
if( i == null || array.split || array.setInterval || array.call )
ret[0] = array;
else
while( i )
ret[--i] = array[i];
}
return ret;
},
Реализовано перебором, правда каким-то извращенным... Интересно, они не догадались про «slice» или не используют его, потому что не возможно заставить работать в IE? :rolleyes:
p.p.s. не зря, наверное, придумали «makeArray» в «jQuery», значит нужная функция.
Последний раз редактировалось Octane, 25.08.2008 в 16:16.
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
проблемка с классом |
magistr_bender |
AJAX и COMET |
13 |
15.09.2008 20:43 |
|
|
|