Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   getElementsByTagName для нескольких тэгов (https://javascript.ru/forum/events/4144-getelementsbytagname-dlya-neskolkikh-tehgov.html)

MaxB 27.06.2009 00:04

getElementsByTagName для нескольких тэгов
 
Код:

var a = document.getElementsByTagName('tag1');
var b = document.getElementsByTagName('tag2');

Подскажите, плиз, как объединить a и b в один массив?
Или может можно как-то искать сразу по нескольким тэгам.

в результате должен работать следующий код:

Код:

for(var i=0; i < длина a+b;i++){
выполнение действий над  элементом массива a+b.
}


Octane 27.06.2009 01:13

Создайте новый массив последовательным перебором каждой коллекции элементов.

MaxB 27.06.2009 01:17

Хотелось бы найти вариант получше. Если он есть.

Octane 27.06.2009 01:40

кросс-браузерного получше нет

Все браузеры, кроме IE:
var list1 = document.getElementsByTagName("tag1");
var list2 = document.getElementsByTagName("tag2");

list1 = Array.prototype.slice.call(list1); // тут IE выдаст ошибку
list2 = Array.prototype.slice.call(list2);

list1 = list1.concat(list2);

for (var i = 0; i < list1.length; i++) {
    …
}


Браузеры, поддерживающие Selectors API (FF3, IE8, Safari3.2, Google Chrome, Opera 9.6):
var list = document.querySelectorAll("tag1,tag2");

for (var i = 0; i < list.length; i++) {
    …
}

Kolyaj 27.06.2009 14:19

document.getElementsByTagName('*')
А при переборе уже имя тега проверять.

Pattern 27.06.2009 15:23

Цитата:

Сообщение от Kolyaj (Сообщение 23090)
document.getElementsByTagName('*')
А при переборе уже имя тега проверять.

Не советую никогда так делать, ибо getElementsByTagName вернёт список (массив) всех элементов на странице. А на динамически создаваемых страницах их может быть немереное количество -> "пожирание" памяти.
Octane дал одно из правильных решений. Только я бы всё таки прототайп не стал трогать. Можно и так реализовать:
function getTagsNames(){
  var res=new Array();
  var tmp=null;
  for(var a=0;a<arguments.length;a++){
    tmp=document.getElementsByTagName(arguments[a]);
    for(var t=0;t<tmp.length;t++)
      res.push(tmp[t]);
  }
  return res;
}

Ну и собственно вызов
var mytags=getTagsNames('div','span');

Количество указываемых тагов может быть неограниченным от 0 и выше. Последовательность тагов в массиве будет соответсвовать тому, как вы передадите их в параметрах функции. Ну и собсно, если ничего не найдено, вернётся пустой массив.

MaxB 27.06.2009 17:44

Спасибо всем.

Kolyaj 27.06.2009 18:54

Цитата:

Сообщение от Pattern
Не советую никогда так делать, ибо getElementsByTagName вернёт список (массив) всех элементов на странице. А на динамически создаваемых страницах их может быть немереное количество -> "пожирание" памяти.

В том-то и дело, что не массив. Кто вам сказал, что они в память все загружаются? А вот ваша функция как раз массив формирует, и как раз память и жрет.

BETEPAH 07.12.2011 19:42

Цитата:

Сообщение от Kolyaj (Сообщение 23103)
В том-то и дело, что не массив.

Как не массив? Разве document.getElementsByTagName('*') возвращает не массив? А что же тогда перебирать потом?

x-yuri 07.12.2011 20:45

https://developer.mozilla.org/en/DOM...mentsByTagName


Часовой пояс GMT +3, время: 19:29.