2009-11-03 2 views
5

Ho trascorso probabilmente un mese a cercare su Internet questo problema e devo ancora trovare la risposta a questo. Il mio codice fa quanto segue (tutto Javascript).Document.Domain madness

Diciamo che ho un test.html su mydomain.com

  1. Molto prima cosa nella sezione di testa ho impostato document.domain = 'mydomain.com';

  2. Poi, creare dinamicamente iframe, impostare src a "subdomain.mydomain.com/test2.html"

  3. Append iframe per DOM

  4. subdomain.mydomain.com/test2.html: molto la prima cosa nella sezione head: document.domain = 'mydomain.com';

  5. Test2.html ha evento on_dom_ready che cerca di comunicare con i genitori tramite WINDOW.PARENT

funziona in tutti i browser. anche in IE6! L'unico problema è che quando aggiorno la pagina in IE, ottengo l'errore di accesso negato.

L'unico modo per liberarmi di questo errore è attendere 12 secondi prima di chiamare window.parent. Neanche 5 secondi di aiuto, devo letteralmente aspettare 12 secondi. Non ha senso per me.

Qualcuno ha qualche esperienza con questo?

+0

Avete questo problema in IE7 e IE8, o solo IE6? –

+0

IE 7 e IE6 entrambi, non sono stati testati su IE8 – Gotys

+0

Per aggiornamento, si intende colpire F5 o fare clic nell'area dell'URL e premere Invio? Questi attivano 2 diversi "stili" di ricarica, uno che colpirà la cache al 100%, l'altro che controllerà il server per i tempi modificati l'ultima volta. Se visualizzi l'errore solo durante l'aggiornamento con F5, prova ad aggiornare posizionando il cursore nella finestra dell'URL e premendo Invio. – jvenema

risposta

2

È perché l'evento onload nel frame principale non è ancora attivato e quindi il DOM non è completamente compilato. Ecco un kludge che esegue la scansione di un div a un intervallo fino a quando è presente, senza far saltare in aria: risposta

var minmax_SCANDELAY= 500; 
var minmax_scanner; 

function minmax_scan() { 
    if (!window.parent.document.getElementById('content')) return; 
    window.clearInterval(minmax_scanner); 

    //replace following function call with your own. 
    doYourMagicHere(); 
} 

minmax_scan(); 
minmax_scanner= window.setInterval(minmax_scan, minmax_SCANDELAY); 
+0

Grazie mille! Questa è una specie di informazione utile. L'intervallo è una buona idea invece di un timeout, ho dovuto avvolgere la condizione window.parent nella dichiarazione try/catch, perché mi stava dando dei permessi di rifiuto. Il problema più grande e più strano, tuttavia, è che ci vogliono veramente 10 secondi affinché il window.parent diventi disponibile per il frame principale.Ho persino cambiato i miei eventi on_dom_ready in on_loads, per sicurezza, nothign ha aiutato. Vorrei sottolineare ancora una volta - questo non è un caso sul PRIMO caricamento della pagina .. subito dopo un aggiornamento. Qualche idea? – Gotys

0

di furtivo mi ha aiutato molto! Era corretto al 100% sul fatto che l'evento onload fosse davvero il problema. Ho guardato più in profondità nel mio codice e ho scoperto, che prima di creare l'iframe il bambino, io sono lazy loading alcuni script con la tecnica di seguito:

lazy_load: function(url,on_finish_function) 
{ 
    var head = document.getElementsByTagName("head")[0]; 
    var script = document.createElement("script"); 
    script.src = url; 
    var done = false; 

    var This = this; 
    // Attach handlers for all browsers 
    script.onload = script.onreadystatechange = function() 
    { 
     if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) 
     { 
      done = true; 
      on_finish_function.call(This,null); 
      head.removeChild(script); 
     } 
    }; 
    head.appendChild(script); 
}, 

La funzione di cui sopra modifica la sezione HEAD del documento. L'iframe secondario viene generato su on_finish da questa funzione lazy_load.

La mia ipotesi è che i browser IE si spaventano veramente di questo e impiegano 12 secondi per riprendersi dallo shock di avere il documento modificato in questo modo :) Cosa posso fare su questo problema? Perché l'IE impiega così tanto tempo per riprendersi dalla manipolazione dom di lazy_load?

+0

head.removeChild (script); all'interno del mio evento onload stava causando il problema. Problema risolto! – Gotys