http://www.jsdir.com/tutorials/
INTRODUZIONE AL DOM1 PER IE5 - NN6
(Seconda parte)


Abbiamo già visto nel tutorial precedente sull'argomento , come ricavare il riferimento al tipo di nodo.


tipo=document.getElementById('nome_elemento').childNodes[n].nodeType  che restituisce un numero in base al tipo di elemento.
Vediamo nella tabella sottostante le corrispondenze a questi numeri.


 ELEMENT_NODE

 1

ATTRIBUTE_NODE 

 2

TEXT_NODE 

 3

CDATA_SECTION_NODE 

 4

ENTITY_REFERENCE_NODE 

 5

ENTITY_NODE 

 6

PROCESSING_INSTRUCTION_NODE 

 7

COMMENT_NODE 

 8

DOCUMENT_NODE 

 9

DOCUMENT_TYPE_NODE 

 10

DOCUMENT_FRAGMENT_NODE 

 11

 NOTATION_NODE

 12



Altri Metodi e Proprietà supportati da IE5 e NN6

 

 

attributes[]

array degli attributi dell'elemento

item(n)

metodo per raggiungere un elemento nella nodeList
Con NN6 funziona solo con l'indice , con IE5 anche
inserendo al posto di "n" l'id dell'elemento.

splitText(dove)

divide il testo al carattere specificato dal numero. Il nodo prende il valore della prima parte , il nodo fratello creato prende la seconda parte

specified

asscociato ad attributes specifica se l'attributo ha un valore con true altrimenti false

data

restituisce il testo di un nodeText

id

id del nodo (esempio aa.id)

 

 



Esempi

//--Restituisce il valore di un nodo testo figlio del secondo "div" del documento--

sa=document.getElementsByTagName('div').item(1).childNodes[0].data
alert(sa)

//--Restituisce : "rr" uguale alla seconda parte del testo , "pp" uguale alla prima parte--
var txt = document.createTextNode('fourlength');
  var rr = txt.splitText(4).data;
  var pp = txt.data;         
  alert(rr)
  alert(pp)


 

//--Specifica se l'attributo "type" del div "uno" ha un valore, in questo caso la risposta è true , altrimenti false--

ff=document.getElementById("uno").attributes['type'].specified
alert(ff)


//--Il valore dell'attributo id del div--

ff=document.getElementById("uno").id
alert(ff)




Rilevamento dei nodi con IE5 e NN6
Al momento risulta abbastanza problematico effettuare il rilevamento dei nodi scendendo la gerarchia "document.nodo_figlio[n].nodo_figlio[n] "  perchè IE5 ed NN6 hanno al momento un'interpretazione diversa della gerarchia. NN6 rileva tra i nodi effettivi dei nodi di testo che in realtà non esistono. Questa diversa interpretazione del documento (peraltro al momento la motivazione non la conosciamo) porta ad alcune problematiche nel realizzare script per IE5 e NN6 , perchè se si utilizza un array di nodi figli e le corrispondenze sono diverse , capite benissimo che il risultato sarà diverso. Per risolvere (al momento) questo problema utilizziamo un piccolo script che rileva i nodi testo senza valore e li salta in NN6 così da ottenere lo stesso risultato con IE5 e NN6. L'esempio sottostante rileva i nodi figli del div "uno"

<html>
<head>
<title>test</title>
<script language="javascript">
var cc=new Array();
function normal(quale){
bd=document.getElementById(quale);
qt=bd.childNodes.length;
for(i=0; i<qt; i++){
aa=bd.childNodes[i].nodeType;
bb=bd.childNodes[i].data;
if((aa==3) && (bb==0) ){
cc[i]=bd.childNodes[i]=bd.childNodes[(i+1)]
}
else {
cc[i]=bd.childNodes[i]
alert(cc[i].nodeName)
}
}

}
</script>
</head>

<body onLoad="normal('uno')">
<div id="uno">
nodo testo
<p align="left">paragrafo1</p>

<p align="left">paragrafo2</p>


<p>paragrafo3</p>
<p>paragrafo4<br>
</p>
</div>
testo fuori dal div
</body>

</html>

Eliminazione dei nodi in NN6 (realizzato da Paolo Carena)

Questo è un esempio realizzato da  p.carena@TOGLIMItiscalinet.it   per eliminare i nodi nel rilevamento di quelli che a noi interessano in NN6 in modo da ottenere lo stesso risultato con i due browser.

<html>
<head>
<title>test</title>
<script language="javascript">
bottoneverifica=false
var cc=new Array();
function normal(){
bd=document.body
ni=qt=bd.childNodes.length
alert("numero nodi iniziali = "+qt)
for(i=0; i<qt; i++){
aa=bd.childNodes[i].nodeType;
bb=bd.childNodes[i].data;
if((aa==3) && (bb==0) ){

/*rimuove il nodo se di natura testo privo di contenuto*/

alert("questo lo tolgo fino a quando non scopro a che serve..."+bd.childNodes[i].nodeName);
document.body.removeChild(bd.childNodes[i]);qt-=1
}

else {
cc[i]=bd.childNodes[i]
alert(cc[i].nodeName)
}
}

if(ni!=qt)
alert("se ci sono riuscito ho rimosso "+eval(ni-qt)+" nodi testo misteriosi");bottoneverifica=true}
</script>
</head>

<body onLoad="normal()">
cc
<p align="left">sssssssssssssssssssssssssss</p>
<p align="left">sssssss</p>
<p>&nbsp;</p>
<p>fffffffffffffffffffffffffffffff</p>
<p>vvvvvvvvvvvvvvvvvvvvvvvvvvvvv<br>
<br>
jjjjjjjjjj</p><form>
<input type=button
onclick=bottoneverifica?normal():alert('aspettalesecuzioneautomatica!')
value="riprova a far girare la funzione per vedere se ha avuto
successo">
</form>
</body>
</html>

Rilevare i nodi figli ( tre livelli) (realizzato da Paolo pippopdATiol.it )

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Visualizza il DOM W3C per IE5+ NS6.</TITLE>
</HEAD>
<BODY id="corpoID" name="corpoName">
<PRE >
/*******************************************
// JAVASCRIPT SOURCE
// Visualizza il DOM W3C.
//
// .Date - Nov 2K
// .Author - pippopd
********************************************
</PRE>
<H1>Visualizza il DOM W3C per IE5+ NS6</H1>
Visualizza in una nuova finestra la gerarchia ad albero dei nodi presenti 
nel DOM per i tre livelli sottostanti all'oggetto chiamato.<BR>
Viene inoltre visualizzato il nodeName, nodeValue, ID, name.

<PRE>funzioni: 
dom() visualizza tre livelli partendo dall'inizio;
dom(IDogg) IDogg l'ID di un elemento;
dom('',ogg) ogg un oggetto dichiarato con il metodo "classico"
es.:document.body o con il DOM W3C gerarchia 
di nodi es.: document.childNodes[0].childNodes[1]
</PRE>
<H3>Browser</H3>
<div id="div1">
<PRE id="pre3ID" name="pre3Name" >
testato con IE 5.0, NS 6
</PRE>
</div>

<H3>Differenze Anomalie</H3>
<PRE id="pre4ID" name="pre4Name" >
NS6 individua come nodi, con nodeValue #test, alcuni spazi vuoti tra tag
Nella richiesta del DOM per un oggetto definito con la gerarchia dei nodi,
per sopperire, non certo in modo assoluto, alla differente interpretazione 
degli spazi tra IE5+ e NS6, e' stato inserito un controllo che, nel caso 
l'oggetto indicato abbia valore #text verra' preso in considerazione il nodo 
fratello successivo
NS6 non indivua l'attributo name di un oggetto
IE5.0 Non individua il nodo #text interno ai tag TITLE e SCRIPT

Non pertinente ma importante.
NS6: un elemento di una tabella scritta con javascript, sembra non ereditare
il colore di sfondo dall'elemento genitore.</PRE>
Per qualsiasi osservazione e/o miglioria <A href=mailto:pippopdATiol.it>pippopdATiol.it<A>


<HR>
<H3>Test</H3>
Visualizza il DOM del <A href="javascript:dom('corpoID')">ID *corpo* (BODY)</A><BR>
Visualizza il DOM del <A href="javascript:dom('',document.body)">oggetto *document.body*</A><BR>
Visualizza il DOM del <A href="javascript:dom('',document.childNodes[1].childNodes[1])">nodo *document.childNodes[1].childNodes[1]* (BODY)</A><BR>
Visualizza il DOM dal <A href="javascript:dom()">primo elemento</A><BR>
<HR>
</BODY>
</HTML>

<SCRIPT LANGUAGE=javascript type="text/javascript">
<!-- // verifica DOM W3C fino a 3 livelli
function dom(IDogg,ogg){
//alert(IDogg+' '+(IDogg.toString().indexOf('object')>=0))
if (IDogg && document.getElementById(IDogg)) obj=document.getElementById(IDogg).childNodes
else if (ogg && ogg.toString().indexOf('object')>=0) {
obj=(ogg.nodeName=="#text")?ogg.nextSibling.childNodes:ogg.childNodes;
}
else obj=document.childNodes;
pippo= new Array;
c=0;
for (i=0;i<obj.length;i++){
if (obj==document.childNodes)
pippo[c]='<TR style="background-color:#808080"><TD style="background-color:#808080">document</TD><TD>'+i+'</TD><TD>'+obj[i].nodeName+'</TD><TD>&nbsp;'+obj[i].nodeValue+'</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
else {
valId=(obj[i].id)? obj[i].id:'';
valName=(obj[i].name)? obj[i].name:'';
pippo[c]='<TR style="background-color:#808080"><TD style="background-color:#808080">'+obj[i].parentNode.nodeName+'</TD><TD>'+i+'</TD><TD>'+obj[i].nodeName+'</TD><TD>&nbsp;'+obj[i].nodeValue+'</TD><TD>&nbsp;'+valId+'</TD><TD>&nbsp;'+valName+'</TD></TR>';
}
c++;

if (obj[i].hasChildNodes()){
obj1=obj[i].childNodes;
for (m=0;m<obj1.length;m++){
valId=(obj1[m].id)? obj1[m].id:'';
valName=(obj1[m].name)? obj1[m].name:'';
pippo[c]='<TR style="background-color:#778899"><TD style="background-color:#778899">..+..'+obj1[m].parentNode.nodeName+'</TD><TD>.'+m+'</TD><TD>'+obj1[m].nodeName+'</TD><TD>&nbsp;'+obj1[m].nodeValue+'</TD><TD>&nbsp;'+valId+'</TD><TD>&nbsp;'+valName+'</TD></TR>';
c++;
if (obj1[m].hasChildNodes()){
obj2=obj1[m].childNodes;
for (n=0;n<obj2.length;n++){
valId=(obj2[n].id)? obj2[n].id:'';
valName=(obj2[n].name)? obj2[n].name:'';
pippo[c]='<TR style="background-color:#a9a9a9"><TD style="background-color:#a9a9a9">..+..+..'+obj2[n].parentNode.nodeName+'</TD><TD>..'+n+'</TD><TD>'+obj2[n].nodeName+'</TD><TD>&nbsp;'+obj2[n].nodeValue+'</TD><TD>&nbsp;'+valId+'</TD><TD>&nbsp;'+valName+'</TD></TR>';
c++;
if (obj2[n].hasChildNodes()){
obj3=obj2[n].childNodes;
for (g=0;g<obj3.length;g++){
valId=(obj3[g].id)? obj3[g].id:'';
valName=(obj3[g].name)? obj3[g].name:'';
pippo[c]='<TR style="background-color:#d3d3d3"><TD style="background-color:#d3d3d3">..+..+..+..'+obj3[g].parentNode.nodeName+'</TD><TD>...'+g+'</TD><TD>'+obj3[g].nodeName+'</TD><TD>&nbsp;'+obj3[g].nodeValue+'</TD><TD>&nbsp;'+valId+'</TD><TD>&nbsp;'+valName+'</TD></TR>';
c++;

}
}

}
}

}
}
}
// alert(pippo.length+' '+c)
var aa=window.open('about:blank','nuova');
aa.document.write('<HTML><BODY>');
aa.document.write('<TABLE border=1 width="95%" style="background-color:#7fffd4">');
aa.document.write('<TR style="background-color:#d3d3d3"><TD style="background-color:#d3d3d3">Nodo</TD><TD>n° child</TD><TD>nodeName</TD><TD>nodeValue</TD><TD>IDValue</TD><TD>nameValue</TD></TR>');
for (i=0;i<pippo.length;i++)aa.document.write(pippo[i]);
aa.document.write('</TABLE>');
aa.document.write('<HTML>');
aa.document.write("<hr>");
aa.document.close();
}
// -->
</SCRIPT>



Esempio di javascript DOM1 per IE5 e NN6 (Fabiano - pippopd)

Creazione dinamica di una select in base all'opzione scelta in un'altra select( IE5.5 NN6)

<script language="javascript">

Lombardia= new Array("* scegli *","Sondrio","Milano","Lodi","Varese");
Emilia=new Array("* scegli *","Rimini","Parma");
function crea(zz){

if(document.getElementById){
 if(zz !=""){
  hh=eval(zz);
  pp=hh.length;
  if(!document.getElementById('nuovo')){
   var newElem =document.createElement("select");
   newElem.id="nuovo";
   document.getElementById('form1').appendChild(newElem)
  } else {
    ss=document.getElementById('nuovo').childNodes.length;
   for (i=0;i<ss;i++) {
    se=document.getElementById('nuovo').childNodes
    document.getElementById('nuovo').removeChild(se[0])
   }

  }
  for(i=0; i<pp; i++){
   var newElem1= document.createElement("option");
   newElem1.setAttribute('value',hh[i]);
   var newText1 = document.createTextNode(hh[i]);
   newElem1.appendChild(newText1) ;
   document.getElementById('nuovo').appendChild(newElem1)
  }
  document.getElementById('nuovo').style.display="inline";
 } else{
  document.getElementById('nuovo').style.display="none"
 }
}
}
</script>

</head>
<body>
<form method="POST" id="form1">
  <p><select size="1" name="D1"
onChange="crea(this.options[this.selectedIndex].value)">
    <option selected value="">SCEGLI REGIONE</option>
    <option value="Lombardia">Lombardia</option>
    <option value="Emilia">Emilia</option>
  </select></p>
</form>
</body>
</html>



Copyright ©2000 - JsDir - JavaScript Directory
Sono consentiti l'uso e la diffusione di questa pagina senza alcuna restrizione o limitazione solo a patto che venga lasciata integra e ne venga citata la fonte.
WebMaster: Riccardo Riccardi (webmasterATjsdir.com) - Autore: Fabiano Andreotta (fabianoATjsdir.com)