Avatar billede johan.o Nybegynder
06. november 2005 - 18:06 Der er 8 kommentarer og
1 løsning

childNodes collection

Jeg har forsøgt at finde hoved og hale i childNodes collection. Scriptet, nedenunder, finder billedet der er placeret i den højre celle <td>, ved en mouseover på <tr> elementet.

Men der er et par ting jeg gerne vil spørge om.

1.: FF childNodes collection er 5 item's, IE's er 3. Jeg har fundet frem til at det er 3 ekstra text nodes. I microsoft's dokumentation står at IE sorterer disse text nodes fra collectionen men hvor er de rent faktisk placeret og kan jeg forhindre at FF 'finder' dem ?

2.: Nedenstående script finder billedet ved at bruge det sidste item() der har tagName="TD", men hvis jeg nu sætter en ekstra celle på rækken i tabellen, så finder mit script ikke billedet. Er der en nemmerer/bedre/mere korrekt måde at finde childNodes 'stien' til billedet ?

Mvh. Johan

Koden :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
<title>Test.</title>
<style type="text/css">

table { border: 1px solid black; }
tr { cursor: pointer; }
td { border: 1px solid red; }

</style>
<script type="text/javascript">

function oFunc(oTR, act)
{
for(i=0; i<oTR.childNodes.length; i++) {
  if(oTR.childNodes.item(i).tagName=="TD") {
  oImg = new Object(oTR.childNodes.item(i).firstChild); } }
act=="in"? oImg.src="pic.jpg":oImg.src="pic1.jpg";
return true;
}

</script>
</head>

<body>

<table style="width: 400px; margin: 0 auto;">
<tr onmouseover="oFunc(this, 'in')" onmouseout="oFunc(this, 'out')">
<td>Noget tekst !</td>
<td><img src="pic1.jpg" alt="oPic"></td>
</tr>
</table>

</body>
</html>
Avatar billede skovenborg Nybegynder
06. november 2005 - 19:13 #1
1: Prøv at kigge på http://developer.mozilla.org/en/docs/Whitespace_in_the_DOM. Funktionerne is_all_ws og is_ignorable (som afhænger af is_all_ws) i den store grå boks kan du bruge til at teste om de forskellige nodes i din collection kan ignoreres (dem som IE sorterer fra).
Avatar billede skovenborg Nybegynder
06. november 2005 - 19:26 #2
2: Okay, først og fremmest behøver du ikke skrive
oImg = new Object(oTR.childNodes.item(i).firstChild);
men bare
oImg = oTR.childNodes.item(i).firstChild

Ud over det, så kan jeg ikke se hvorfor du ikke bare giver billedet en id og henter den via document.getElementById(). I det andet tilfælde løber du bare alle cellerne i rækken igennem og henter det første element, så naturligvis kan du ikke vide hvad du ender med da oImg hele tiden ændrer sig.
Avatar billede olebole Juniormester
06. november 2005 - 19:34 #3
<ole>

- og når du ittererer gennem en collection af noder, kan du i øvrigt altid teste på en node's 'nodeType'. Er den 3, er der tale om en tekst-node. Er den derimod 1, er der tale om en element-node.

/mvh
</bole>
Avatar billede skovenborg Nybegynder
06. november 2005 - 19:41 #4
hvilket præcis er hvad is_ignorable gør (nåja, og tester for om det er en kommentar). Måske skulle jeg lige poste dem her:

Fra http://developer.mozilla.org/en/docs/Whitespace_in_the_DOM:
function is_all_ws( nod )
{
  // Use ECMA-262 Edition 3 String and RegExp features
  return !(/[^\t\n\r ]/.test(nod.data));
}

function is_ignorable( nod )
{
  return ( nod.nodeType == 8) || // A comment node
        ( (nod.nodeType == 3) && is_all_ws(nod) ); // a text node, all ws
}
Avatar billede johan.o Nybegynder
06. november 2005 - 19:49 #5
skovenborg>> Med hensyn til getElementById() så har du fuldstændig ret, det vil sikkert være en bedre løsning i dette tilfælde, men det giver mig jo ikke indblik i childNodes funktionalitet, og det er jo derfor jeg har rejst 'debatten' :)

Men tak for linket - det kigger jeg lige på.

Mvh. Johan
Avatar billede johan.o Nybegynder
06. november 2005 - 20:02 #6
Wouw, der var lige lidt mere der kom til mens jeg skrev. Super.

Jeg har lige kigget på dit (skovenborg) link og allerede er jeg jo blevet meget klogere...syntes jeg selv :), det er jo 'new line's der skaber de 'ekstra' nodes.

Dette : <tr onmouseover="oFunc(this, 'in')" onmouseout="oFunc(this, 'out')"><td>Noget tekst !</td><td><img src="pic1.jpg" alt="oPic"></td></tr> på en linje fjerner jo de ekstra nodes, nå tilbage til læsningen :)

Mvh. Johan
Avatar billede johan.o Nybegynder
06. november 2005 - 22:51 #7
Orker ikke at læse mere nu :) men skovenborg hvis du smider et svar så lukker jeg her, for jeg har fandt god læsning via dit link. Tak til alle.

Mvh. Johan
Avatar billede skovenborg Nybegynder
06. november 2005 - 22:55 #8
ja, okay...men har du nogle spørgsmål angående det her så skal du bare skrive løs :-)
Avatar billede johan.o Nybegynder
06. november 2005 - 23:03 #9
Will do :)

Mvh. Johan
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester