Autor | Zpráva | ||
---|---|---|---|
sysel Profil |
#1 · Zasláno: 22. 7. 2009, 18:17:09
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 |
#2 · Zasláno: 22. 7. 2009, 18:30:57
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 |
#3 · Zasláno: 22. 7. 2009, 19:11:59
Č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') cCely[index].firstChild.value 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 |
#4 · Zasláno: 22. 7. 2009, 19:28:07
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 |
#5 · Zasláno: 22. 7. 2009, 20:09:47
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! |
||
Časová prodleva: 16 let
|
0