Autor Zpráva
Lubosh
Profil
Dobrý den,
omluvám se za podivný nadpis :-)

mám zápis v javascriptu:

var paras = document.getElementsByTagName('h1');


potřebuju ale kromě tagu <h1> více tagů: <h2>, <h3>, <p> apod.
Jak to zapsat. Už jsem zkoušel:

var paras = document.getElementsByTagName('h1','h2','h3','p');

nebo

var paras = document.getElementsByTagName('h1'),('h2'),('h3'),('p');


To je ale asi blbost.
fajzen
Profil
document.getElementsByTagName('h1','h2','h3','p');
takto, ako si už asi zistil, to nefunguje a takto:
document.getElementsByTagName('h1'),('h2'),('h3'),('p');
už vôbec nie

musíš ich volať samostatne:
var paras = new Array();
paras.concat(document.getElementsByTagName('h1'), document.getElementsByTagName('h2'), document.getElementsByTagName('h3'), document.getElementsByTagName('p'));
Lubosh
Profil
Super,

děkuju.
Lubosh
Profil
No - nefunguje to :-)
Chamurappi
Profil
Reaguji na Luboshe:
nefunguje to :-)
To je tím, že metoda getElementsByTagName nevrací pole, ale kolekci elementů. Ta se sice poli hodně podobá, ale je na rozdíl od něj živá, což znamená, že se při zásazích do DOMu průběžně aktualizuje. Neznám žádný způsob, jak sloučit víc živých kolekcí do jedné živé kolekce, ale samozřejmě jde vyrobit (neživé) pole a nasypat do něj současný stav kolekcí.

Třeba takhle:
var paras = [];
for(var i = 0, tagName; tagName = ["h1", "h2", "h3", "p"][i]; i++)
  for(var j = 0, element; element = document.getElementsByTagName(tagName)[j]; j++)
    paras.push(element);
fajzen
Profil
aha, pardon, netestoval som to a som si neuvedomil, že getElementsByTagName nevracia pole prvkov, ale objekt HTMLCollection, takže sa nedá spájať pomocou concat...

ale našiel som na webe funkciu, ktorá robí presne to, čo potrebuješ:
function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}

Zdroj: quirksmode.org
Na tej stránke je aj podrobný popis funkcie. Len tak stručne popis parametrov:
list - zoznam hľadaných tagov oddelených čiarkou (napr. 'h1,h2,h3,p')
obj - element, v ktorom sa má vyhľadávať, ak sa nezadá, vyhľadáva sa v celom doumente
_es
Profil
fajzen:
Veď to robí vlastne to isté, s drobnými vylepšeniami, čo ten krátky Chamurappiho kód. A pre vrátenú hodnotu platia tie isté obmedzenia ako on uvádza.

Neznám žádný způsob, jak sloučit víc živých kolekcí do jedné živé kolekce
Teoreticky by to snáď mohlo ísť predefinovaním metód valueOf a toString, a ďalšími fintami, no asi by sa to veľmi nevyplatilo. Jednoduchšie by mohlo byť vyrobiť takú funkciu, kde by sa vlastne len zmenil typ zátvoriek. A taká vec ako vlastnosť length by sa na mnohých prehliadačoch nasimulovať nedala.
fajzen
Profil
_es:
Veď to robí vlastne to isté, s drobnými vylepšeniami, čo ten krátky Chamurappiho kód.
áno, ja netvrdím že nie... ale keď som začal písať svoj príspevok, tak ten jeho kód tu ešte nebol

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: