Zaklady DOM

Programovacie jazyky, rady, poradňa...
Katy30
Amateur
Amateur
Príspevky: 33
Registrovaný: 08 nov 2009, 16:51
Bydlisko: koniec sveta
Kontaktovať používateľa:

Zaklady DOM

Príspevok od používateľa Katy30 »

Ahojte

Neviete mi poradit, preco mi nefunguje tento kod ?

Kód: Vybrať všetko

<body>
	<div>
		<p id="odstavec1">Obsah odstavca</p>
		<p id="odstavec2">Obsah odstavca 2</p>
	</div>
	
	<script type="text/javascript">
		var node = document.getElementById("odstavec1");
		var x = node.nextSibling;
		
		document.write(x.innerHTML);
	</script>
</body>
Je to trivialne a vobec neviem, co tam moze byt zle. node.innerHTML, ale ked chcem vypisat hodnoty dalsich elementov, dostanem len "undefined". Dakujem
lama2d
VIP
VIP
Príspevky: 1006
Registrovaný: 24 feb 2005, 14:54
Bydlisko: PostgreSQL

Re: Zaklady DOM

Príspevok od používateľa lama2d »

skús miesto nextSibling použiť nextElementSibling
Katy30
Amateur
Amateur
Príspevky: 33
Registrovaný: 08 nov 2009, 16:51
Bydlisko: koniec sveta
Kontaktovať používateľa:

Re: Zaklady DOM

Príspevok od používateľa Katy30 »

Dakujem, funguje to. Ale preco to predtym neslo ? Je to podla w3c aj nejakeho tutorialu na webe. Nieco je tam vynechane ?
lama2d
VIP
VIP
Príspevky: 1006
Registrovaný: 24 feb 2005, 14:54
Bydlisko: PostgreSQL

Re: Zaklady DOM

Príspevok od používateľa lama2d »

Problém nextSibling je, že nepodporuje whitespace. Alebo ináč povedané, berie ako ďalší element aj whitespace... Musel by si tie elementy teda natlačiť na seba.

Kód: Vybrať všetko

<p id="odstavec1">Obsah odstavca</p><p id="odstavec2">Obsah odstavca 2</p>
Poprípade to riešiť funkciou navyše...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Zaklady DOM

Príspevok od používateľa audiotrack »

nextSibling je staršia funkcia, a vracia ako súrodencov elementu aj neviditeľné znaky. Teda po tvojom odstavec1 nasleduje tabulátor ktorý je pred odstavec2 a ten nemá žiaden innerHTML, preto ti napíše undefined. Funkcia nextElementSibling tieto prázdne znaky nevracia, a bola pridaná práve z tohto dôvodu. Dovtedy sa musela emulovať asi takto:

Kód: Vybrať všetko

function nextElementSibling(n){
   x=n.nextSibling;
   while (x.nodeType!=1){
     x=x.nextSibling;
   }
   return x;
}
pretože nextSibling vracia objekt, ktorého atribútom je okrem iného aj nodeType a ten je 1 ak je to tag, a -1 ak je to whitespace. Takže odporúčam používať nextElementSibling, ale treba si overiť aj či to prehliadač podporuje alebo nie. V opačnom prípade si treba ošetriť toto čo som vyššie spomínal
Katy30
Amateur
Amateur
Príspevky: 33
Registrovaný: 08 nov 2009, 16:51
Bydlisko: koniec sveta
Kontaktovať používateľa:

Re: Zaklady DOM

Príspevok od používateľa Katy30 »

Aha. Fajn, takze na toto sa pokusim dat si pozor. Dakujem.

A este jedna vec mi nejak nejde do hlavy ...

na w3c je takyto kod

Kód: Vybrať všetko

<html>
<body>

<p id="intro">Hello World!</p>

<script type="text/javascript">
x=document.getElementById("intro");
document.write(x.firstChild.nodeValue);
</script>

</body>
</html>
a takyto vystup

Kód: Vybrať všetko

Hello World!

Hello World!
ale moc tomu nerozumiem. firstChild oznacuje prveho potomka, ale <p id="intro"> predsa nie je prvy potomok <p id="intro">. Nie je ten vystup zly ?

//ps:pozeram, ze ten whitespace nie je podporovany ani u inych property. firstChild tiez funguje, len ked to hadzem bez medzier :/ Existuju nejake alternativy, alebo je nutne pouzit vlastne metody ?

Dakujem
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Zaklady DOM

Príspevok od používateľa audiotrack »

firstElementChild, lastElementChild.. analogicky ako predošlí príklad
Napísať odpoveď