Newsgroup: it.comp.lang.javascript
Titolo: problemi in Firefox with replace in DOM

Ho un codice this Javascript che rimpiazza tramite DOM, il contenuto di un 
elemento html con del cdata ottenuto da un document xml (come risposta dal 
server).
var newData;
 var cdata = content.firstChild.data;
    cdata = cdata.replace(/^\s*|\s*$/g,"");
    if(cdata.length == 0) {
        newData = "<span id='" + id + "'></span>";
    } else {
        newData = cdata;
    }
    if (el.outerHTML){
        el.outerHTML=newData;
    } else if ( document.createRange ){
        var rng = document.createRange();
        if (rng.selectNode && rng.createContextualFragment){
            rng.selectNode(el);
            var df = rng.createContextualFragment(newData);
            el.parentNode.replaceChild(df, el);
        }
    }
Funziona sempre bene con IE (che ha outerHTML definito)  e con Flock (che ha 
outerHTML non defnito come firefox).
Invece con Firefox alcune volte funziona correttamente, in altri invece 
sostituisce male (aggiunge anzichè sostituire oppure fa altre cose che non 
ho ben capito fatto sta che il risultato non va bene).
Ci sono problemi con quel codice dentro "else if" per Firefox che voi 
sappiate?

     }
Mai usato ma a naso sembra corretto:
 
http://www.mozilla.org/docs/dom/domref/dom_range_ref26.html#1005287
il problema è (Sempre a naso) cosa stai duplicando e dove ... magari se
generi 2 id uguali firefox fa casini? Oppure quel el.parentNode che poi
rimpiazza proprio "el" con "df" magari lo manda in trip? (strano ma non
impossibile...)
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 ha scritto nel messaggio 
news:o0kkv3ae...@ID-147253.user.individual.net...

Guarda prova con questa pagina HTML:
<html>
<script>
function func(id) {
 var el = document.getElementById(id);
 var newData = "<span id=" + id + ">ciao mondo</span>";
    var rng = document.createRange();
    rng.selectNode(el);
    var df = rng.createContextualFragment(newData);
    el.parentNode.replaceChild(df, el);
}
</script>
   <body>
      <span id="prova">
       <table><tr><td>Vedi carrello</td></tr></table>
      </span>
      <a href="#" onclick="func('prova');">Sostituisci!</a>
   </body>
</html>
Funziona solo con i browser mozzilla ovviamente.
comunque come vedi sembra aggiungere l'elemento anziche' sostituirlo.
Se pero' invece guardi il codice prodotto con una alert, vedi che la 
sostituzione e' avvenuta correttamente.
E' la visualizzzione che ha problemi!
E' un baco? 

 Guarda prova con questa pagina HTML:
[CUT]
Non so che dire...sembrerebbe non considerare i childNodes...cioè, se metti
   <div id="Contenitore"><span id="prova">Vedi carrello</span>
      <a href="#" onclick="func('prova');">Sostituisci!</a>
   </div>  
Funziona correttamente, con la table non funziona (o quantomeno, come dici
te se visualizzo l'html risulta corretto [tutta la table non esiste più],
ma a video resta...
-- 
"qualcuno è andato per età
 qualcuno perchè già dottore
 e insegue una maturità, si è sposato, fa carriera
 ed è una morte un po' peggiore"
									    F.G.

 Guarda prova con questa pagina HTML:
span è un elemento "inline". Non può contenere elementi con un tipo di
visualizzazione diverso, come un elemento table.
E' normale che ti dia quel casino in visualizzazione. Quindi, o usi un tag
block-level al suo posto (div, per esempio), oppure rendi block il tag
span:
<style type="text/css">
	span#prova{display:block}
</style>
Se aggiungi questo vedrai che la visualizzazione andrà a posto.
-- 
~ Io sono il più importante dei miei problemi.

 visualizzazione diverso, come un elemento table.
:-O ... strano perň che con un alert del documentElement visualizzi una
cosa e a video un'altra, non trovi?
-- 
"e mai che mi sia venuto in mente
 di essere piů ubriaco di voi
 di essere molto piů ubriaco di voi"
									  F.D.A.

 cosa e a video un'altra, non trovi?
No. La visualizzazione degli elementi dipende in gran parte dall'attributo
"display", soprattutto nei browser standard.
Pensa ai neofiti che tentano di nascondere/mostrare una riga di una tabella
alternando gli attributi "none" e "block", e rimangono basiti dopo qualche
click del comportamento dei browser Gecko.
Comportamento del tutto normale, perché il display di default di un
elemento TR è "table-row", e non certo "block". Funziona su IE, solo perché
IE è "ignorante".
-- 
~ You don't have to be crazy to be a webmaster. But it helps.

 "display", soprattutto nei browser standard.
Sě sě, lo so...solo mi suona strano il diverso comportamento...a naso o non
fai nulla o fai tutto, non fai solo una parte. Era solo una considerazione
(ricordo anche le mie personali madonne sul table-row...)


 (ricordo anche le mie personali madonne sul table-row...)
Bastava ripristinare il display di default, eliminando quello inline
tramite stringa vuota, come ora hai imparato. :)
-- 
~ Io sono il piů importante dei miei problemi.

 ha scritto nel messaggio 
news:1j9brgp56zw5l$.dlg@ID-171124.news.individual.net...

Tanto per cominciare a ragionare correttamente...span + table e' scorretto a 
causa dell'attiruto di display, non centra niente la sostituzione via DOM 
vero?
Il borwser sarebbe tenuto a visualizzare male lo span + table anche prima 
della sosttuzione?
Ah il codice javascript che ho postato era proprio il tuo! ;) 

 Ah il codice javascript che ho postato era proprio il tuo! ;)
Si, l'avevo riconosciuto. ;) Ma all'epoca dovevi sostituire un DIV, per
l'appunto. ;)
-- 
~ Se il destino è contro di noi, peggio per lui!