Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.08.2008, 23:40
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 25.08.2008, 09:29
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Ну arguments, как минимум, является объектом JScript, а DOMNodeList -- объектом DOM.
Ответить с цитированием
  #3 (permalink)  
Старый 25.08.2008, 12:46
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 25.08.2008, 12:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

ZoNT, вопрос не в том, почему работает с arguments, а в том, почему не работает с DOMNodeList.
Ответить с цитированием
  #5 (permalink)  
Старый 25.08.2008, 12:57
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

потому что аргументс - это почти массив, а домлист - это дом лист...
Ответить с цитированием
  #6 (permalink)  
Старый 25.08.2008, 13:00
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Оригинальный ответ Следовательно, во всех браузерах, кроме ИЕ, DOMNodeList -- это почти массив.

З.Ы. Что за нечеткая логика? Объект или является массивом, или не является, третьего не дано. Ни arguments, ни DOMNodeList массивами не являются.
Ответить с цитированием
  #7 (permalink)  
Старый 25.08.2008, 13:03
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

Он не является нигде, просто некоторые браузеры работают с ним по-разному и всё...
Это как парсинг даты: можно написать чтобы он жрал некорректные строки, а можно чётко придерживаться стандарта...
Ответить с цитированием
  #8 (permalink)  
Старый 25.08.2008, 13:33
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от ZoNT
Он не является нигде
Если бы DOMNodeList являлся массивом, темы бы не было. Вопрос в том, как преобразовать коллекцию в массив без перебора элементов.
Ответить с цитированием
  #9 (permalink)  
Старый 25.08.2008, 13:34
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

я подумаю
Ни разу таким вопросом не задавался...

А оно надо? Помоему перебор - тоже неплохо... А нестандартный способ будет наверняка не быстрее...

Последний раз редактировалось ZoNT, 25.08.2008 в 13:37.
Ответить с цитированием
  #10 (permalink)  
Старый 25.08.2008, 16:07
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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