2010-05-26 20 views
6

Tengo una página que funciona perfectamente bien en Firefox, pero está arrojando un error en IE. Estoy cargando jQuery dinámicamente (si aún no está cargado) y luego hago algunas cosas en el bloque jQuery (document) .ready(). Sin embargo, IE lanza el temido error "Objeto esperado" cuando golpea el bloque jQuery (document) .ready().IE7 jQuery (documento) .ready() problema

Usted puede ver el código de página completa aquí: http://www.pastie.org/977767

IE es tirar el error a la derecha en jQuery ready (documento)().

¿Alguna idea de lo que está pasando aquí? De nuevo, esto funciona perfectamente bien en Firefox. Parece que IE piensa que jQuery está cargado, pero realmente no lo está o que jQuery aún se está cargando cuando se encuentra el bloque jQuery (document) .ready()?

Respuesta

2

Cuando agrega una secuencia de comandos al documento, se descarga de forma asincrónica. En IE, el siguiente 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); 
} 

... se analiza y se ejecuta antes de IE ha finalizado la descarga y análisis de la secuencia de comandos de jQuery. Este podría no ser el caso en Firefox si Firefox ya ha guardado en caché el script, no tardaría en descargarse y se puede analizar inmediatamente. Podrían los analizadores sintácticos funcionar de forma diferente, Firefox analizando el script tan pronto como se descargue e IE poniendo en cola el análisis hasta que el hilo permanezca inactivo.

Puede mover este código al final de la función setUpJquery, lo que significa que solo se ejecutará cuando el objeto jQuery esté disponible. Alternativamente, puede poner el código dentro de su propia función y llamar a esa función desde la función setUpJquery.

+0

Gracias, pero el código que ve en realidad está en varios archivos diferentes. Los scripts de carga de jQuery se utilizan en muchas páginas diferentes, por lo que no puedo poner código específico en él. ¿Hay alguna otra forma en que pueda verificar jQuery (document) .ready() y solo procesarlo una vez que jQuery esté realmente cargado? – Zendog74

+0

@ Zendog74: podría hacer jQuery una parte sincrónica del documento. En lugar de usar DOM para agregar, use algo como 'if (typeof jQuery ==" undefined ") document.write ('');'. Esto garantizaría que jQuery se recupere antes de que se ejecuten otros scripts. –

+0

Gracias ... eso lo hizo. Definitivamente no es tan elegante, pero funciona. Ojalá IE y FFX se comporten consistentemente al cargar scripts externos, suspiro. – Zendog74

1

La forma en que me dieron alrededor de ella fue:

$(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'); 
} 

no es bonito pero funciona ... Funciona a través de varios archivos, en todos los navegadores que puedo pensar (que me importa) y significa que no tiene que meterse con el código fuente de la página principal. Para que pueda mantenerse al margen de las etiquetas.

Cuestiones relacionadas