Newsgroup: it.comp.lang.javascript
Titolo: Uilizzo di removeChild

Ho provato a fare un po' di ricerche ma non ne vengo a capo....
Attivando o meno una checkbox vengono mostrati i layer che sono stati 
creati da un pulsante 'crea', tuttavia avrei l'esigenza di cancellarli 
definitivamente quando spengo tutto, altrimenti ricompaiono sempre 
(giustamente).
L'idea è allora quella di usare 'removeChild' appena chiamo la 
funzione.... ma ottengo un errore!!
Mi date una mano?
Non vi posto tutto il codice per non appesantirvi ma credo solo quello 
utile per capire la sintassi.
--------
var o=document.getElementById("esercizio");
if (o.firstChild)
document.body.removeChild(div) // ... errore: "incompatibilità tra tipi"
  	var div=document.createElement("div");
    	div.setAttribute('id','layer_');
    var tab=document.createElement("table");
       	tab.setAttribute('border','1');
       	tab.setAttribute('width','200');
       	tab.setAttribute('cellSpacing','1');
	div.appendChild(tab);
    var tbdy=document.createElement("tbody");
       	tab.appendChild(tbdy);
    var tr0=document.createElement("tr");
         tbdy.appendChild(tr0);
    var td0=document.createElement("td");
         td0.setAttribute('id','uno');
	td0.setAttribute('valign','top');
 
    tr0.appendChild(td0);
    var text1=document.createTextNode('la mia cella');
    td0.appendChild(text1);
    o.appendChild(tab);
---------------
  Grazie mille!!

 document.body.removeChild(div) // ... errore: "incompatibilità tra tipi"
Questo non mi sembra bellissimo...se devi rimuovere dall'oggetto
"esercizio" (o) non dovrebbe essere o.removeChild(div) ?
Inoltre questo div cos'è? Perché vedo che *DOPO* ciò lo dichiari, non è che
è undefined? Se è il primo nodo non dovrebbe essere
o.removeChild(o.firstChild) ?
Non ho letto tutto il resto, vedi intanto con questa correzione.
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 
...ehm... div è questo nel codice html:
<div id="esercizio"><!-- inserisco testo--></div> in pratica dove vado a 
inserire la mia cella.
Ora con "o.removeChild(o.firstChild)" mi fa generare solo una cella....
Guarda ora che domanda ti vado a fare... :-(
Così facendo, significa che ogni volta che chiamo questa funzione, 
elimino tutto ciò che era presente ed inizio quindi la creazione di un 
nuovo layer?
Grazie per la pazienza!!
----
var o=document.getElementById("esercizio");
if (o.firstChild)
o.removeChild(o.firstChild) // cancello tutto ciò che c'era!!!


 nuovo layer?
Non capisco...se vuoi "svuotare" l'intero div non basta o.innerHTML="" ?
Scusami, magari sono io che oggi sono più addormentato delle altre mattine,
ma non riesco bene a seguirti
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 nuovo layer?
No, elimini solamente il *primo* nodo figlio dell'elemento div. Che sia un
nodo di testo, un elemento html o quant'altro. Esempio:
<div id="esercizio">
	<span>primo</span>
	<span>secondo</span>
	<div>terzo 
		<strong>...</strong>
	</div>
</div>
Indovina che codice HTML ottieni,secondo gli standard W3c, se utilizzi il
removeChild? Questo:
<div id="esercizio"><span>primo</span>
	<span>secondo</span>
	<div>terzo 
		<strong>...</strong>
	</div>
</div>
Perche' il primo nodo presente era un nodo di testo (che conteneva il
ritorno a capo con tabulazione).
IE si comporta diversamente, avresti ottenuto la rimozione dell'elemento
SPAN con contenuto "primo".. purtroppo sappiamo che come browser, non segue
gli standard. Quindi stai sempre attento quanto utilizzi questo genere di
cose.
-- 
ZER0
~ The Tangent Universe collapsed 5890 days, 4 hours, 10 minutes and 18 seconds ago.

 Non capisco...se vuoi "svuotare" l'intero div non basta o.innerHTML="" ?
Vade retro satanaaaaa...!
Hai un utente che si sta sforzando di usare le DOM API del W3C, e tu gli
propini qualcosa al di fuori di quegli standard..?
-- 
ZER0
~ The Tangent Universe collapsed 5890 days, 4 hours, 23 minutes and 44 seconds ago.

 
..... sempre più :-(.... diciamo che l'intero codice, con l'inserimento 
della riga "o.removeChild(o.firstChild)" mi permette, ogni volta che 
chiamo la funzione, di cancellare quanto presente e generare solo 
un'unica cella

sei sempre più illuminante....

 propini qualcosa al di fuori di quegli standard..?
Era per evitargli inutili mal di pancia giocando col DOM e IE...
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 riga, mi permette di generare solo una cella
Ah ok...ma forse stai ragionando male? Vuoi cancellare il contenuto,
inserire una cella, se poi viene richiamato *AGGIUNGERE* un'altra cella? Se
sì devi chiamare il removeChild solo la prima volta...


 sei sempre più illuminante....
Eh, me lo diceva la mia insegnante che avrei dovuto intraprendere la
carriera del messia; ma non mi convinceva troppo la "liquidazione"..
BTW, adesso hai tre alternative (rimanendo in ambito standard w3c):
La prima, e' ciclare gli elementi contenuti nel tuo div, finche' non li hai
rimossi tutti.
La seconda, e' inserire un tag intermedio, tra il tuo div e i figli, in
modo che poi vai a rimuovere quello (e di conseguenza i suoi figli).
La terza, rimuovi direttamente il div con id "esercizio", e lo ricrei,
riposizionandolo laddove era precedentemente.
Tutte e tre funzionano. Io sarei per la terza, perche' non stai ne' a fare
cicli, ne' a creare un tag "tampone" in piu'.. solo, bisogna vedere come e'
strutturata la pagina per poter scrivere il codice aduguato. ovvero, di
quale nodo, il div "esercizio" e' figlio e se e' seguito/precedutoo da
altri nodi.. e quali.
-- 
ZER0
~ The Tangent Universe collapsed 5890 days, 4 hours, 40 minutes and 56 seconds ago.

 Era per evitargli inutili mal di pancia giocando col DOM e IE...
Nessun mal di pancia,fidati.
E nessun browser sniffing, o cose del genere.
-- 
ZER0
~ The Tangent Universe collapsed 5890 days, 4 hours, 42 minutes and 0 seconds ago.

 
Penserai "... proprio strano 'sto tipo" però è esattamente quanto volevo 
fare: generare un (unico ) layer ogni volta che chiamo questa funzione e 
cancellare quello precedente

ZER0 ha scritto:

La terza alternativa è interessantissima ed in effetti ci avevo pure 
pensato (giuro!).
Supponiamo che si tratti di una riga all'interno di una tabella.
Se avessi una cosa del genere:
---
<table>
<tr>
	<td></td>
</tr>
<tr>
	<td><div id="esercizio"></div></td>
</tr>
</table>
significa che <div> è figlio di <td>, che è figlio di <tr> e così via 
fino ad arrivare a document?

 carriera del messia; ma non mi convinceva troppo la "liquidazione"..
ROTFL ! In effetti non so se vale la pena...
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 cancellare quello precedente
Non è strano, solo che allora non capisco cosa non ti funziona...se dici
che ogni volta ti cancella tutto e riesci ad inserire solo una cella, ed è
ogni volta solo una cella quello che vuoi, è esattamente quello che hai
ottenuto...o no?


 
Esattamente quanto cercavo di fare da stamattina!
Per tipo strano intendevo me stesso ;-)

 fino ad arrivare a document?
Non tanto a document, quanto al documentElement, ovvero al tag <html> (nel
nostro caso).
Cmq si, il discorso e' piu' o meno quello.
Pero', come ti ho detto se vi sono spazi, ritorno a capo, o tabulazioni,
significa che esiste un nodo di tipo testo, che IE interpreta male, mentre
i broswser che seguono gli standard interpretano bene.. quindi bisogna
prestare attenzione in alcuni casi.
Tornando a noi, se il tuo scopo e' sostituire completamente i div
"esercizio" e la tua struttura e' bene o male quella, ti basta fare:
var mydiv=document.getElementById("esercizio"),
	pnode=mydiv.parentNode;
// rimuovo il div "esercizio"
pnode.removeChild(mydiv);
// ricreo il nodo
mydiv=document.createElement("div");
mydiv.setAttribute("id","esercizio");
// aggiungo figli al nodo
mydiv.appendChild(document.createTextNode("hello"));
// aggiungo il nodo al documento, nella posizione in cui stava prima
pnode.appendChild(mydiv);
mydiv=null;
pnode=null;
Considera che questo ti funziona bene perche' nel TD non hai altri nodi
oltre al DIV. Altrimenti noteresti come, ogni volta che esegui la funzione,
quest'ultimo viene "accodato". Per questo ti ho detto che uno script del
genere dipende dalla struttura della pagina.
-- 
ZER0
~ The Tangent Universe collapsed 5890 days, 5 hours and 38 minutes ago.

 ROTFL ! In effetti non so se vale la pena...
Bisogna vedere poi "chi di dovere" ti da' effettivamente la "pensione"
oppure no.. :)
-- 
ZER0
~ The Tangent Universe collapsed 5890 days, 5 hours, 38 minutes and 53 seconds ago.