Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.07.2010, 12:23
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Быстрый разбор списка элементов.
Всем мир.
На самом деле не надеюсь, что решение есть, но рискну спросить.
Как преобразовать список элементов в строку или массив?

Я пробовал так:
var arr = Array.prototype.slice.call(document.getElementsByTagName('*'));

и так:
var arr = Array.prototype.join.call(document.getElementsByTagName('*'));


и так:
function test(){
  var arr = Array.prototype.slice.call(arguments);
}
test.apply({}, document.getElementsByTagName('*'));


Осел такие трюки не понимает. Как его проучить?

И почему он arguments может преобразовать в массив, а список элементов и атрибутов нет?

зы: хотя я подозреваю почему... arguments - объект JScript, а остальное объекты DOM.
Ответить с цитированием
  #2 (permalink)  
Старый 11.07.2010, 14:46
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Скорее всего, никак:
getElementsByTagName для нескольких тэгов
Ответить с цитированием
  #3 (permalink)  
Старый 11.07.2010, 14:57
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от B~Vladi
Я пробовал так:
var arr = Array.prototype.slice.call(document.getElementsByTagName('*'));
Сообщение от B~Vladi
Осел такие трюки не понимает.
IE9 теперь умеет так делать.

Сообщение от B~Vladi
Как его проучить?
// Преобразует NodeList в Array
// Реализация только для Standards Compliant Mode
if (!Array.toArray) {
	try {

		// IE9 и все остальные браузеры поддерживают преобразование NodeList в массив при помощи slice.
		Array.prototype.slice.call(document.childNodes); // IE6–8 здесь выбросят исключение.
		Array.toArray = function (slice) {
			return function (anything) {
				return slice.call(anything);
			};
		}(Array.prototype.slice);

	} catch (error) {

		Array.toArray = function (anything) {
			var length = anything.length, i = -1, array = [];
			if (length) {
				while (++i < length) {
					array[i] = anything[i];
				}
			}
			return array;
		};

	}
}

Последний раз редактировалось Octane, 11.07.2010 в 15:08.
Ответить с цитированием
  #4 (permalink)  
Старый 11.07.2010, 16:04
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Многие браузеры тупое переписывание выполняют быстрее чем slice.call . Так-что смысла нет столько всего писать, достаточно просто:
Array.toArray = function $A(iterable) {
	if (iterable) {
		var result = [], i = iterable.length;
		while (i) result[--i] = iterable[i];
		return result;
	}
	return [];
};

Последний раз редактировалось Riim, 11.07.2010 в 16:37.
Ответить с цитированием
  #5 (permalink)  
Старый 11.07.2010, 16:10
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Octane, я так и думал, что без цикла не обойтись.
Раз уж так все плохо, то я бы для ишака максимально оптимизировал код:
Array.toArray = function (anything) {
  var l = anything.length;
  while (length--) {
    array[i] = anything[i];
  }
  return array;
};

Всем спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 11.07.2010, 16:11
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Riim
Многие браузеры тупое переписывание выполняют быстрее чем slice.call
Надо будет потестить.
Ответить с цитированием
  #7 (permalink)  
Старый 11.07.2010, 16:37
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от B~Vladi
while (length--) {
в последней итерации происходит лишнее перезаписывание переменной length. Не понимаю почему все так делают.
Ответить с цитированием
  #8 (permalink)  
Старый 11.07.2010, 19:18
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Riim
в последней итерации происходит лишнее перезаписывание переменной length
Есть вариант по-лучше?
Ответить с цитированием
  #9 (permalink)  
Старый 11.07.2010, 19:37
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Сообщение от B~Vladi Посмотреть сообщение
Есть вариант по-лучше?
Array.toArray = function(anything) {
  var array = [];
  for (var l = anything.length, l--; ) {
    array[i] = anything[i];
  }
  return array;
};


UPD Хотя нет, туплю, тут тоже лишняя перезапись есть

Последний раз редактировалось e1f, 11.07.2010 в 19:44. Причина: UPD
Ответить с цитированием
  #10 (permalink)  
Старый 11.07.2010, 20:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,106

просто как вариант...может так?
var r = document.getElementsByTagName("*");
Array.a = function (a) {
    var b = [];
    for (var c in a) if (typeof a[c] == "object") b[b.length] = a[c];
    return b
};
r = Array.a(r);

)))

Последний раз редактировалось рони, 11.07.2010 в 20:52.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sortable, два связанных списка. Как один из них сделать неизменяемым? kvecxjo jQuery 1 30.03.2010 03:15
Сортировка элементов списка тупым способом ururu Events/DOM/Window 9 11.01.2010 01:41
Выбор элементов и построение списка выбранных элементов. madgals Events/DOM/Window 6 14.04.2009 22:30
Блок выбора элементов из списка. Аля joblist Acrossfy Элементы интерфейса 3 26.03.2009 00:49
Динамическое обновление списка select (продолжение мытарств) macam Элементы интерфейса 2 25.06.2008 16:04