2010-05-26 19 views
6

Ho una pagina che funziona perfettamente bene in Firefox, ma sta gettando un errore in IE. Sto caricando jQuery dinamicamente (se non è già caricato), e poi facendo alcune cose nel blocco jQuery (document) .ready(). Tuttavia, IE lancia l'errore temuto "Object expected" quando colpisce il blocco jQuery (document) .ready().IE7 jQuery (document) .ready() problema

è possibile visualizzare il codice della pagina completo qui: http://www.pastie.org/977767

IE sta gettando l'errore giusto al jQuery (document) .ready().

Tutte le idee su quello che sta succedendo qui? Ancora una volta, questo funziona perfettamente bene in Firefox. Sembra quasi come IE pensa jQuery è caricato, ma in realtà non è ancora o che jQuery è ancora carico quando si incontra il (document) .ready) blocco (jQuery?

risposta

2

Quando si aggiunge uno script per il documento, viene scaricato in modo asincrono. In IE, il seguente script ...

try{ 
jQuery(document).ready(function() { 
    jQuery.getScript("/CalendarViewer/js/utils.js", function(){ 
     jQuery.getScript("/CalendarViewer/js/groupcatselector.js", function(){ 
      jQuery.getScript("/CalendarViewer/js/calendarportlet.js", function(){ 
       jQuery.getScript("/CalendarViewer/js/calendarportletmain.js", function(){ 
        var cpm = calendarportletmain; 
        cpm.doEditDefaults("V_7f208bca412b42a68c19eb104bf46f14", "/CalendarViewer", groupCats_V_7f208bca412b42a68c19eb104bf46f14); 
       }); 
      }); 
     }); 
    }); 
}); 
}catch(err){ 
    alert("error in view.jsp="+err.number+" "+err.description); 
} 

... viene analizzato ed eseguito prima di IE è terminato il download e l'analisi dello script jQuery. Questo potrebbe non essere il caso in Firefox se Firefox ha già memorizzato nella cache lo script, non ci vorrà molto tempo per scaricare e può essere analizzato immediatamente. Potrebbero funzionare in modo diverso i parser, Firefox analizza lo script non appena viene scaricato e IE fa l'accodamento del parsing fino a quando il thread diventa inattivo.

Si potrebbe spostare questo codice alla fine della funzione setUpJquery, il che significa che verrebbe eseguito solo quando l'oggetto jQuery è disponibile. In alternativa, è possibile inserire il codice all'interno della propria funzione e chiamare tale funzione dalla funzione setUpJquery.

+0

Grazie, ma il codice che vedi è in realtà contenuta in diversi file. Gli script di caricamento di jQuery sono usati su molte pagine diverse, quindi non posso inserire un codice specifico. C'è un altro modo in cui potrei mettere un controllo su jQuery (document) .ready() e farlo elaborare una volta che jQuery è stato effettivamente caricato? – Zendog74

+0

@ Zendog74: potresti rendere jQuery una parte sincrona del documento. Invece di usare DOM per aggiungere, usare qualcosa come 'if (typeof jQuery == "undefined") document.write ('');'. Ciò assicurerebbe che jQuery venga recuperato prima dell'esecuzione di altri script. –

+0

Grazie ... l'ha fatto. Sicuramente non è elegante, ma funziona. Vorrei che IE e FFX si comportassero in modo coerente sul caricamento di script esterni, sospiro. – Zendog74

1

Il modo in cui ho ottenuto intorno ad esso era:

$(document).ready(function() { 
    document_init(); 
}); 

function document_init() { 
    try{ 

    checkDivLoaded(); 

    [ ... do more stuff ... ] 

    } catch(err) { 
    setTimeout('document_init()', 200); 
    } 
} 

function checkDivLoaded() { 
    if ($('#targetDiv').length == 0) $jquery.error('not ready'); 
} 

Non è abbastanza, ma funziona ... funziona in più file, in tutti i browser mi viene in mente (che mi interessa) e significa che non devi fare confusione con il codice sorgente della pagina principale. In questo modo puoi tenere il passo con i tag.

Problemi correlati