Newsgroup: it.comp.lang.javascript
Titolo: creare nodo DOM

Quale e' il miglior modo di creare un nodo partendo da un testo hmtl?
Ho provato con
function nodeFromText(text) {
    var el = document.createElement("div");
    el.innerHTML = text;
    //vari controlli su childNodes
    //...
    return el.childNodes[0];
}
Questa funzione "funziona" , ma non sempre ;).
Provate infatti con un testo
"<input type=\"hidden\" id=\"test\" name=\"test\" value=\"Hello\"/>";
innerHTML di el viene correttamente assegnato, ma non si ripercuote sulla 
collection childNodes.
Tutto questo provato solamente con Firefox 1.5.0.2.
P.S
Vorrei un metodo generale che funziona con qualsiasi testo html che 
rappresenta un nodo solo (non piu' nodi top-level). 

 Tutto questo provato solamente con Firefox 1.5.0.2.
Per scrupolo, ho provato e a me funziona correttamente:
var el = document.createElement("div");
el.innerHTML = "<input type=\"hidden\" id=\"test\" name=\"test\"
value=\"Hello\"/>";
alert(el.childNodes.length); // risponde "1"
alert(el.childNodes[0]); // risponde "[object HTMLInputElement]"
Quindi, o intendevi qualcos'altro, oppure c'è qualcosa che ti falsa il
risultato (o hai un'installazione buggata di FF, come caso limite da
considerare).
-- 
"Non è una guerra.. è uno sterminio.. loro stanno a noi come 
uomini contro i  vermi.. draghi contro i lupi.. 
O uomini che cavalcano draghi e lanciano lupi addosso ai vermi!"

 considerare).
Ti ringrazio  per la risposta, ma infatti come hai previsto il problema era 
altrove ;)
(penso causata da una funzione di callback usata per il fading con dojo).
Comunque la mia idea e' di ottenere dal server del codice html o xhtml, e 
crearci un nodo chiamato "dest".
Poi applico un effetto di fade-out al nodo da sostituire (source) e fade-in 
a quello sostituente(dest), dopo aver applicato la sostituzione con
source.parent.replaceNode(dest, source); 

 ha scritto nel messaggio 
news:444b5cb9$0$29097$5fc...@news.tiscali.it...

Mi sono imbattuto in un problemino: la seguente funzione "prende in input" 
(in realta' sono proprieta' di un oggetto) del testo html e un id. Voglio 
rimpiazzare il vecchio elemento con quello nuovo effettuando un effetto di 
fading (usando dojo).
component.refresh = function() {
    var source = document.getElementById(this.nodeId);
    var dest = createFromText(this.data);
    if (null == dest) {
        dest = createSpan(this.nodeId);
    }
    dojo.style.setOpacity(dest, 0.0);
    var duration = 300;
    function fadeIn() {
        replaceNode(source, dest);
        dojo.fx.html.fadeIn(dest, duration);
    }
    dojo.fx.html.fadeOut(source, duration, fadeIn);
};Il problemone e' che replaceNode deve essere assolutamente fuori da fadeIn 
(perche' questa viene chiamata secondo un meccanismo di callback in maniera 
asincrona quindi).
cioe' voglio che il rimpiazzamento venga assoluitamente fatto dentro la 
funzione refresh, l'effetto di fading puo' anche essere fatto in maniera 
asincrona..non mi interessa piu' di tanto. 

 asincrona..non mi interessa piu' di tanto.
In tutta onestà, non riesco a seguire bene il tuo ragionamento, o meglio a
indentificare qual'è il tuo problema.


 indentificare qual'è il tuo problema.
Voglio fare la sostituzione del nodo subito, e mostrare l'effetto di fading 
in un qualsiasi momento (anche subito, ma anche dopo non importa).
Il problema e' che devo fare.
dojo.fx.fadeOut(nodo, tempo, gestisciFadeIn);
questo fa il fadeout, e quando finisce richiama la funzione di callback 
gestisciFadeIn.
La funzione sara' fatta cosi:
function gestisciFadeIn() {
rimpiazzaIlNodo();
dojo.fx.fadeIn(nodo, tempo);
}
Come vedi con questo sistema il dimpiazzamento del nodo avviene in un 
secondo momento (ovvero tra il fadeout e il fadein). Io non voglio cio', 
vorrei torvare un modo per farlo prima della chiamata a fadeout, e ottenere 
comunque l'effetto grafico.
Ci vuole qualche espediente forse...


Provo a chiarire ancora meglio: questo e' l'impianto che vorrei usare:
component.refresh = function(sourceId, text, applicaEffettoCustom) {
    var source = document.getElementById(sourceId);
    var dest = createFromText(text);
    source.parentNode.replaceChild(dest, source);
    applicaEffettoCustom(source, dest);
}
Lasciamo anche stare dojo a questo punto.
Come faccio dentro applicaEffettoCustom a fare il fadeout (del nodo source 
che non c'e' piu' nel DOM tra l'altro) e il fadein del nodo dest (facile 
perche' c'e' gia').

 comunque l'effetto grafico.
Detta così, continua a sfuggirmi la problematica, perché basterebbe fare
proprio come dici. Ovvero, fare la sostituzione *prima* della chiamata a
fadeout:
	sostituisci();
	dojo.fx.fadeOut(nodo, tempo, gestisciFadeIn);
Cmq ho visto che hai scritto un altro post, cercherò di capirci qualcosa di
più di là.


 che non c'e' piu' nel DOM tra l'altro)
Per l'appunto. :)
