Ciao a tutti come da titolo lavorando con le funzioni DOM di js mi sono imbattuto in qlkosa di mooolto strano :
Codice PHP:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
body{margin:0;padding:0}
</style>
<script type="text/javascript">
function test2()
{
var test = new Test();
test.createTable();
}
var Test = function()
{
var pannello = document.getElementById("main_box");
var pannello_interno = document.createElement( "div" );
pannello.appendChild(pannello_interno);
// forzo il ricaricamento del puntatore ... sotto IE NON VAAAAAAAAA !!!!!
pannello_interno= pannello.firstChild;
this.createTable = function(){ creaTabella(); }
function creaTabella()
{
/*Stampa riferimento di pannello_interno e del primo figlio*/
alert("(1) "+pannello_interno+"->"+pannello_interno.firstChild);
/*
Stampa il riferimento del pannello contenitore
-> del primo figlio
->-> e del secondo figlio se esiste il primo
il primo figlio e' pannello_interno il secondo e' la tabella creata
*/
alert( "(1.1) "+pannello+"->"+pannello.firstChild+"->->"+(pannello.firstChild ? pannello.firstChild.firstChild : "null") );
var table = document.createElement( "table" );
table.setAttribute("border" , "1");
var tbody = document.createElement( "tbody" );
var tr = null;
var td = null;
var tmp_val = null;
for(var i=0 ; i<10 ; i++ )
{
tr = document.createElement("tr");
for(var j=0 ; j<10 ; j++ )
{
tmp_val = document.createTextNode( "["+j+","+i+"]" );
td = document.createElement("td");
td.appendChild(tmp_val);
tr.appendChild( td );
tmp_val = null;
td = null;
}
tbody.appendChild( tr );
tr = null;
}
table.appendChild(tbody)
pannello_interno.appendChild(table);
pannello.appendChild(pannello_interno);
/*Stampa riferimento di pannello_interno e del primo figlio*/
alert("(2) "+pannello_interno+"->"+pannello_interno.firstChild);
}
}
</script>
</head>
<body>
<table cellspacing="0" cellpadding="0" border="1" width="100%" height="100%">
<tr>
<td>[url="javascript:test2()"]CARICAAAAAAAA[/url]</td>
</tr>
<tr>
<td id="main_box"></td>
</tr>
</table>
</body>
</html>
Copiate il testo in un file .html e provate ad eseguirlo.
Come prima cosa lo script dovrebbe creare un oggetto Test usato per creare un sottopannello in main_box. E dentro quel pannello dovrebbe metterci una tabella 10x10.
La cosa funziona ma ci sono dei problemi con i puntatori interni alla classe Test.
provatelo sotto FF3 e sotto IE Vederete che il puntatore a pannello interno assume valori diversi. Sotto firefox rimane il riferimento sotto IE NO!!!!!
Per ritornare al nodo che mi serve devo rinavigare tutto l'albero a partire da main_box.
Sinceramente non capisco perche', ho pensato fosse un problema di scoping delle variabili visto il casotto che ha fatto ecma nella fase di standardizzazione di sto linguaggio.
quello che mi lascia basito e' questa porzione di codice e quello che stampa fuori :
Codice PHP:
......
/*Stampa riferimento di pannello_interno e del primo figlio*/
alert("(1) "+pannello_interno+"->"+pannello_interno.firstChild);
/*
Stampa il riferimento del pannello contenitore
-> del primo figlio
->-> e del secondo figlio se esiste il primo
il primo figlio e' pannello_interno il secondo e' la tabella creata
*/
alert( "(1.1) "+pannello+"->"+pannello.firstChild+"->->"+(pannello.firstChild ? pannello.firstChild.firstChild : "null") );
.......
In teoria pannello_interno dovrebbe avere un figlio dopo la prima esecuzione del metodo.
Ma ie dice di no. Invece se riscorro l'albero dalla radice il nodo esiste eccome
Sinceramente nn capisco
e' come se
nodo1 = new Nodo();
nodo2 = new Nodo();
nodo3 = new Nodo();
nodo1.appendChild(nodo2);
nodo2.appendChild(nodo3);
Dovrebbe fare l'albero
nodo1->nodo2->nodo3
quindi se faccio
stampa(nodo2.firstChild )
dovrebbe stampare nodo3.
Ma invece non stampa nulla e mi tocca fare
stampa(nodo1->firstChild->firstChild )
Non so ...... pls help!!!!!