Newsgroup: it.comp.lang.javascript
Titolo: DOM e IE

Stranamente sembra che la seguente manipolazione del DOM su IE dia problemi 
se la pagina non e' HTML valido.
var node = document.createElement("script");
node.type="text/javascript";
node.src=url;
document.getElementsByTagName("head")[0].appendChild(node);
se in un altra sezione <script>
richiamo una funzione definita nel javascript appena importato essa non e' 
disponibile.
Con FF funziona sempre.
Con IE sembra essere disponibile solo se il documento e' perfettamente 
valido.
Puo' essere? Possibili soluzioni? 

 document.getElementsByTagName("head")[0].appendChild(node);
Come ti ho detto, non č mia abitudine fare questo genere di cose; quindi ho
fatto un rapido test su una pagina locale che aggiungeva un file remoto, con
due pulsanti: uno per aggiungere tale file, l'altro per richiamare una
funzione in esso definita.
Ho provato sia in quirks che in standard mode, ed in entrambi ha funzionato
correttamente (IE6, W2K).
Pubblica del codice online dove l'errore viene replicato, in modo che si
possa dare un'occhiata.
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)


Scusa, avevo cannato il doctype.
Praticamento con il doctype per HTML4 strict (una cosa simile eheh), si 
verificava giustamente il problema.
Passando a "loose" invece tutto va come sperato!
Grazie comunque. 


Ora invece ha ripreso a non andare.
La correttezza della pagina non centra credo.
Comunque se provi in locale da filesystem direttamente funziona anche a me.
Prova a fare lo stesso test usando un web server per accedere ai file, e 
vedi che non va, o comunque va solo a volte.
Il test e' molto semplice:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"
http://www.w3.org/TR/html4/loose.dtd
">
<html>
    <head>
        <title>Test</title>
        <meta http-equiv="Content-Type" content="text/html; 
charset=ISO-8859-1">
    </head>
    <body>
        <script type="text/javascript">
            var node = document.createElement("script");
            node.type = "text/javascript";
            node.src = "prova.js";
            document.getElementsByTagName("head")[0].appendChild(node);
        </script>
        <script type="text/javascript">
            test();
        </script>
    </body>
</html>
******prova.js**********
function test() {
    alert("test ok");
} 

 vedi che non va, o comunque va solo a volte.
Potrebbe dipendere dal tempo che ci mette a fare il download del file .js?
-- 
Nando [?]
Apostolo della Prova

 ha scritto nel messaggio 
news:dtao09b2k24r$.k8701kneibls.dlg@40tude.net...

A questo punto....pensavamo che chiudendo il tag e riaprendone uno nuovo, 
non doveva esserci questo problema. Con FireFox infatti funziona, con IE 
sembrava funzionare, ma ora mi accorco che ha un comportamento random. 

 ha scritto:

Non ti so aiutare, non ho esperienza a riguardo; quella di sopra è l'unica
idea che m'è venuta...



A questo punto torno a XHR, dove tu sei piuttosto ferrato ;).
Il problema e' il caching: voglio che la risorsa finisca in cache.
Quello che non capisco e' se manda o no gli header If-Since-Modified, e come 
gestisce una risposta 304 (che significa cache valida) con header 
Last-Modified.
Fa tutto da solo XHR, oppure devo scrivere qualcosa? 

 Fa tutto da solo XHR, oppure devo scrivere qualcosa?
Facciamo una cosa... ti do il numero di qualche amico: si chiamano ZER0,
Cristiano etc... è sicuramente meglio :)


 A questo punto torno a XHR, dove tu sei piuttosto ferrato ;).
Se pensi che il problema sia il tempo di caricamento (sembrerebbe, visto
che in locale va sempre, sembra il problema che ho rilevato anche con
l'apertura delle popup), metti prima di caricare il js (fuori dal js!) un
"var caricato=false;" e al termine del js (dentro il js!) un
"caricato=true;"
anziché chiamare la tua function chiama una function-wrapper che con
setTimeout attende che caricato=true; prima di eseguire "test()".
Non è il massimo, ma così ti sinceri se il problema è quello del tempo di
caricamento.
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 vedi che non va, o comunque va solo a volte.
A me è andato sempre, ma ti ricordo - sempre nel post di cui sopra - che
usavo due pulsanti, il codice non era sequenziale.
Per test avevo cmq rimosso le due funzioni e lasciato il codice di
seguito; e non mi dava alcun problema (sempre IE6, W2K).
Sono anche queste le ragioni per le quali non trovo assolutamente motivo
di simulare qualcosa del genere. Troppo empirico, non hai la certezza
che funzioni sempre in ogni circostanza. Alla fine il gioco non valeva
la candela, nella maggior parte dei casi in cui ho visto fare questo
genere di accroccri si trattava solo di gente che voleva fare un codice
"più figo" o semplicemente simulare il comportamento di altri linguaggi
come java.
Tornando a noi: se hai un codice sequenziale, prova a usare
document.write, piuttosto che le DOM API.
-- 
"Se c'è qualcosa di più importante del mio ego su questa nave,
la voglio catturata e fucilata."

 Potrebbe dipendere dal tempo che ci mette a fare il download del file .js?
No, in quanto il browser aspetta sempre di aver scaricato del codice
javascript prima di passare al successivo blocco. Se non fosse cosě,
sarebbe impossibile sviluppare.
Cosa che non succede, ovviamente, nello stesso blocco. Per questo si
devono utilizzare due blocchi script separati.
L'attributo defer esiste proprio per evitare questo comportamento di
default.
Ovviamente quando si tenta di fare degli accrocchi, non č detto che il
browser in questione riesca a gestire questo genere di situazioni. :)
-- 
"Se c'č qualcosa di piů importante del mio ego su questa nave,



Purtroppo non fa per me neanche "document.write", perche' l'import di codice 
javascript potrebbe avvenire anche dopo il caricamento della pagina.
A questo punto sono orientato ad usare XHR, ma ho quei dubbi per quanto 
riguarda il caching. 

 riguarda il caching. 
Non dovresti aver nessun problema per il caching, anzi. IE cacha
automaticamente le risorse richieste tramite GET, anche con XHR.
-- 
"Se c'č qualcosa di piů importante del mio ego su questa nave,


 sarebbe impossibile sviluppare.
Vero, non ci avevo pensato. Pardon :)


 Perché hai assoluto bisogno di questo genere di snaturazione?
Cosa vuoi che sia se non il solito Aja....
La faccenda sarebbe la seguente: la tecnologia server-side, lavora a 
componenti.
Si sta cercando di farli rientrare in una logica di rendering parziale della 
pagina:
posso decidere quale componente re-renderizzare, e la libreria ottiene 
l'html del componente e lo rimpiazza nella pagina.
Ora questo componente puo' anche renderizzare javascript assieme all'HTML, 
quindi se questo componente ha bisogno di un certo js per funzionare, 
renderizzera' qualcosa come:
<div id="componente">
<script type="text/javascript" src="/loader/componente.js"></script>
....
</div>
Metti ora che ho due componenti nella stessa pagina, il secondo del quale 
appare dopo una manipolazione del DOM:
ottengo *due* import dello stesso javascript, che possono dare problemi.
Quindi ho la necessita' di assicurare che certe risorse siano importare una 
sola volta:
<div id="componente">
<script type="text/javascript">
loadOnce("/loader/componente.js");
</script>
....
</div>
dove loadOnce controlla che la risorsa non sia gia' stata caricata nella 
pagina.

 ottengo *due* import dello stesso javascript, che possono dare problemi.
Perché mai? Primo, non dovresti ottenere due importi dello stesso
javascript. Il problema è quindi eliminato a monte.
Secondo, se anche fosse, non dovresti avere comunque dei problemi in quanto:
a) Il file è stato cachato la prima volta, quindi nessuna successiva
richiesta al server.
b) Se è stato scritto in un certo modo, vai semplicemente a riassegnare
determinati valori/funzioni. E' un passaggio in più e completamente inutile
ridondante, certo (tant'è, ripeto, che non dovrebbe proprio sussistere...
vedasi il punto precedente), ma non dà "problemi" se è stato scritto bene.
E' semplicemente una "sovrascrittura" con i medesimi valori.
Comunque non è chiaro come mai dovresti fare questo "loadOnce" anche dopo
che la pagina è stata caricata: Vuoi poter aggiungere un componente che non
ancora è presente nella pagina, durante l'attività utente?



Si esatto, ad esempio (metti che la pagina e' descritta in XML in questa 
tecnologia lato server):
<link reRender="menu">click</link>
...
 <componenteMenu id="menu" rendered="false"/>
E prima del rendering da codice applicativo imposto rendered="true" in 
qualche modo.
Ora il componente deve essere scaricato per forza, e siamo in seguito ad una 
richiesta XHR, non al caricamento della pagina. 


Sono tutto orecchie (e occhi) ;)...
Mi puoi dare una spintarella verso la strada giusta? 

 richiesta XHR, non al caricamento della pagina.
Ma questo significa che la struttura della pagina esiste già, solo non viene
renderizzata. In tal senso, allora, il comportamento generico dei componenti
definiti, potrebbe essere già incluso, solo "dormiente". Ciò che arriva poi
dal server sono la forma, e il contenuto.


 Mi puoi dare una spintarella verso la strada giusta?
A prescindere dal discorso generale di cui sopra, qui mi riferivo
semplicemente a non mettere un include dentro la pagina in questo modo. Se è
un tag script di quel tipo, va nell'head.



E' possibile anche aggiungere il componente da codice Java, quindi senza lo 
scheletro pre-esistente.
Inoltre ancora si vorrebbe evitare di scaricare tutto il codice se non e' 
necessario.
Puo' darsi insomma che uno non veda mai tale componente all'azione. Pensa 
poi se ci sono 10 componenti abbastanza grossi tutti diversi: avrei un bel 
risparmio di tempi nei tempi di download.
Comunque e' vero che lo <script> andrebbe nell'head, ma ho visto tantissime 
soluzioni che non si fanno alcuno scrupolo a metterlo dove vogliono.
D'altronde cosa posso fare se non voglio scaricare tutto il codice 
all'inizio?! 

 all'inizio?!
Ci sono diverse soluzioni integrabili client/server. Ma, come diceva il
Messia "mica posso fa' tutto io! Ma lo sai a che ora mi son svegliato? Alle
sette meno un quarto!" :)


 ha scritto nel messaggio 
news:efmecdrg4py1$.dlg@ID-171124.news.individual.net...


Uffa, ora sto per mandare all'aria tutto e richiedere un bel tag <script> 
nell'header se vuoi usare il tuo dannato componente.
Meno problemi per tutti.

 Meno problemi per tutti.
Per inciso, non è che devi forzatamente seguire i miei suggerimenti. Sono,
appunto, suggerimenti. Certo, spero che possano "stimolare" qualcuno a
cercare soluzioni migliori, ma non per questo uno deve mandare a capra e
cavoli il proprio lavoro. Anzi, uno dovrebbe fare semplicemente ciò che
reputa meglio o che ha voglia di fare.
Soprattutto se magari ci sono scadenze pendenti, può capitare di non avere
il tempo materiale di riflettere e studiare approcci migliori o alternativi
a quelli già utilizzati.
