Autor Zpráva
sysel
Profil
Pomocí getElementsByTagName() a getElementsByName() se vytváří kolekce objektů, které samy o sobě tvrdí (typeof), že jsou objekty. V popisech se však o nich tvrdí, že jsou to pole. Pokoušel jsem se s nimi zacházet jako s poli i jako s objekty, ale nepřišel jsem na to, jak dvě takové kolekce spojit, nebo alespoň některé prvky jedné kolekce přidat do jiné.
Dokáže mi někdo prozradit, co je doopravdy výsledkem metody getElementsByTagName() a jaké metody lze na výsledek použít? Uvítám i odkaz na nějaký tutorial nebo referenci.
Děkuji
Chamurappi
Profil
Reaguji na sysla:
Neexistují.

V popisech se však o nich tvrdí, že jsou to pole.
Většinou se o nich mluví jako o „živých“ kolekcích. Takže se ani nechovají jako klasické pole, které je „mrtvé“.
Nevím, jestli to neřeknu moc zjednodušeně nebo přímo blbě, ale DOM kolekce si místo svých prvků pamatuje svůj původ. Její prvky se dohledávají až v okamžiku, kdy je z ní lovíš, takže její obsah (i délka) se může v průběhu skriptu měnit pomocí zásahů do DOMu.

Typickým příkladem, kde je ta „živost“ vidět, je kolekce element.childNodes. Řada lidí si myslí, že všechny potomky elementu může smazat tak, že projde cyklem postupně všechny indexy childNodes od nuly do length a zavolá na nich removeChild — jenže to narazí, protože po odstranění nultého childNodu se na jeho místo dostane ten na indexu 1 a length se sníží.

Stejně tak budeš-li vyhledávat pomocí metody getElementsByTagName() na nějakém elementu a nalezený prvek přesuneš tak, že už nebude potomkem elementu, na němž si hledal, také se z kolekce vypaří.

Sečteno a podtrženo: Kolekce není pole. Ani od pole nedědí. Je mu jen trochu podobná.
sysel
Profil
Čili moje snahy byly jen boj s větrnými mlýny. Pokud mám třeba v tabulce smíchány <select>y a <input>y tak přestože mne zajímají jen jejich hodnoty, což bych mohl získat bez ohledu na typ elementu stejným dotazem, mohu stejně získat jen kolekci <select>ů a <input>ů samostatně a dělat to nadvakrát. Hm. Asi by šlo spláchnout to jedním vrzem přes
cCely = tab.getElementsByTagName('td')
a pak se ptát na
cCely[index].firstChild.value
, ale to už mi přijde dost krkolomné.

Každopádně díky za cenný výklad, který je důležitý pro pochopení, ale v popisech často chybí.

BTW někdy je vlastnost length R/O, ale někdy je možné ji přepisovat. U <select>u se právě přes length dají velmi elegantně smazat přebytečné <option>y.
Chamurappi
Profil
Reaguji na sysla:
Čili moje snahy byly jen boj s větrnými mlýny.
Můžeš si jednoduchým cyklem překlopit prvky kolekcí do normálního pole, ale to asi víš.

mohu stejně získat jen kolekci <select>ů a <input>ů samostatně a dělat to nadvakrát
Nebo se můžeš podívat do kolekce formulář.elements, kde jsou naskládané všechny formulářové prvky patřící do obalujícího formuláře.

U <select>u se právě přes length dají velmi elegantně smazat přebytečné <option>y.
Zajímavé, neznal jsem, děkuji.
sysel
Profil
reaguji na Chamurappiho
Můžeš si jednoduchým cyklem překlopit prvky kolekcí do normálního pole
jo jo, to je to co jsem hledal :-)
ale to asi víš.
tak možná latentně, ale hledal jsem to úúúúplně jinde, díky!

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: