|
Быстрый разбор списка элементов.
Всем мир.
На самом деле не надеюсь, что решение есть, но рискну спросить. Как преобразовать список элементов в строку или массив? Я пробовал так:
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. |
Скорее всего, никак:
http://javascript.ru/forum/events/41...kh-tehgov.html |
Цитата:
Цитата:
Цитата:
// Преобразует 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;
};
}
}
|
Многие браузеры тупое переписывание выполняют быстрее чем slice.call . Так-что смысла нет столько всего писать, достаточно просто:
Array.toArray = function $A(iterable) {
if (iterable) {
var result = [], i = iterable.length;
while (i) result[--i] = iterable[i];
return result;
}
return [];
};
|
Octane, я так и думал, что без цикла не обойтись.
Раз уж так все плохо, то я бы для ишака максимально оптимизировал код:
Array.toArray = function (anything) {
var l = anything.length;
while (length--) {
array[i] = anything[i];
}
return array;
};
Всем спасибо. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Array.toArray = function(anything) {
var array = [];
for (var l = anything.length, l--; ) {
array[i] = anything[i];
}
return array;
};
UPD Хотя нет, туплю, тут тоже лишняя перезапись есть :) |
просто как вариант...может так?
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);
))) |
| Часовой пояс GMT +3, время: 08:06. |
|