Newsgroup: it.comp.lang.javascript
Titolo: Tortuosità

Con FF e WebKit se uso:
 
document.getElementById('Frm').addEventListener('load', Routine, false)
 
non funziona. Devo usare:
 
window.setTimeout(Routine,0);
window.setTimeout(function(){document.getElementById('Frm').addEventListener('load', 
Routine, false);},0);
 
Perché?

 Perché?
 
Col primo timeout chiami forzatamente la funzione "Routine" e quindi è 
per questo che tutto pare "funzionare".
 
Se a naso non ci ho azzeccato prova a descrivere meglio la situazione.
 

 descrivi cosa vuoi fare, cosa ti aspetti di ottenere e cosa ottieni.
 
Hai ragione :)
 
il Frm è un iFrame.
Gli attacco un evento da eseguire al caricamento.
Fino a qualche tempo fa dovevo usare il primo codice solo con WebKit 
invece ora mi occorre farlo anche con gli ultimi aggiornamenti di FF.

 non funziona. Devo usare:
 
Premesso quel che ha detto il buon Scartabelli, manca di contesto.
Quindi, ad esempio, mentre lui a naso, ha dedotto che 'Frm' possa essere
un elemento "form", io a naso, direi che potrebbe essere un "frame".
Come vedi, senza contesto, è difficile darti una mano.
 
Nel caso in cui fosse un elemento frame, a me, un codice del genere
"funziona" tranquillamente su FF e WebKit:
 
    <html>
        <body>
            <iframe id="frm" src="myframe.htm"></iframe>
      </body>
      <script>
        document.getElementById("frm")
            .addEventListener("load", function(){
              alert("loaded");
            }, false);
      </script>
    </html>
 

 invece ora mi occorre farlo anche con gli ultimi aggiornamenti di FF.
 
Che versione?
Il codice del mio post precedente ha il risultato che mi aspetto sia su
FF 7.0 che Chrome 14.


 
Esatto.
 
A questo punto, sempre a naso, Corset potrebbe aver aggiunto l'evento 
dopo l'evento load della window principale.

Andrea Scartabelli ha scritto quanto segue il 05/10/2011 20.55>

Si, avete un buon naso :)
Quest'ultima osservazione vuol dire che c'è qualche problema in questo caso?

              <iframe id="frm" src="myframe.htm"></iframe>
il src lo imposto al volo da codice insieme all'evento.

 caso?
 
Penso che Andrea si riferisse a questioni di tempistiche, nel caso in
cui il `src` fosse già impostato, quindi potresti avere una racing
condition dove aggiungi l'evento quando è già stato inviato (come dire,
chiudere il cancello quando son già scappati i buoi).
Ma da quel che hai detto nell'altro post mi viene da pensare che non sia
questo il caso.


Se imposti prima l'evento e poi l'src, non vedo alcun problema:
 
    <html>
        <body>
            <iframe id="frm"></iframe>
        </body>
        <script>
            var iframe = document.getElementById("frm");
 
            iframe.addEventListener("load", function(){
                alert("loaded")
            }, false);
 
            iframe.src = "myframe.htm";
        </script>
    </html>
 
Se nel tuo codice hai un comportamento diverso da questo, e questo ti
funziona come ti aspetti, allora vuol dire che c'è qualcos'altro che non
ci hai detto. Come si diceva prima, il contesto è essenziale.

 caso?
 
Mi riferivo proprio a questioni di tempistiche come diceva Zer0: erano 
solo supposizioni in attesa di tue delucidazioni.
 
Zer0 peraltro dice che basandosi sull'altro post è in dubbio che sia 
questo il tuo caso, a me non viene ancora da escluderlo.
 
Sono un poco assonnato stasera, ma non mi sembra che tu ci abbia ancora 
reso chiara la tua situazione.
Io ti direi: ma se assegni l'attributo src a runtime perché non creare a 
runtime anche l'elemento iframe (difficile in questo caso che i buoi ti 
facciano le pernacchie dall'esterno quando chiudi il cancello)?
 
Poi mi rimetto il cappellino del pedante (sopportami) e ti dico: perché 
non ci scrivi un pezzo di codice che riproduca il problema?