2010-05-26 6 views
6

J'ai une page qui fonctionne parfaitement bien dans Firefox, mais jette une erreur dans IE. Je charge dynamiquement jQuery (s'il n'est pas déjà chargé), puis je fais quelque chose dans le bloc jQuery (document) .ready(). Cependant, IE lance l'erreur redoutée "Object expected" quand il frappe le bloc jQuery (document) .ready().IE7 jQuery (document) .ready() problème

Vous pouvez voir ici le code de pleine page: http://www.pastie.org/977767

IE jette l'erreur à droite jQuery (document) .ready().

Des idées sur ce qui se passe ici? Encore une fois, cela fonctionne parfaitement bien dans Firefox. Il semble presque que IE pense que jQuery est chargé mais ce n'est pas encore le cas ou que jQuery est toujours en train de charger quand le bloc jQuery (document) .ready() est rencontré?

Répondre

2

Lorsque vous ajoutez un script au document, il est téléchargé de manière asynchrone. Dans IE, le script suivant ...

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); 
} 

... est analysé et exécuté avant que IE a terminé le téléchargement et l'analyse du script jQuery. Cela peut ne pas être le cas dans Firefox si Firefox a déjà mis en cache le script, cela ne prendrait pas de temps à télécharger et pourrait être analysé immédiatement. Les parseurs pourraient fonctionner différemment, Firefox analysant le script dès qu'il est téléchargé et IE mettant en file d'attente l'analyse jusqu'à ce que le thread devienne inactif.

Vous pouvez déplacer ce code à la fin de la fonction setUpJquery, ce qui signifie qu'il ne sera exécuté que si l'objet jQuery est disponible. Vous pouvez également placer le code dans sa propre fonction et appeler cette fonction depuis la fonction setUpJquery.

+0

Merci, mais le code que vous voyez est contenu dans plusieurs fichiers différents. Les scripts de chargement jQuery sont utilisés sur de nombreuses pages différentes, donc je ne peux pas y mettre de code spécifique. Existe-t-il un autre moyen de vérifier jQuery (document) .ready() et de ne le traiter qu'une fois jQuery chargé? – Zendog74

+0

@ Zendog74: Vous pouvez faire de jQuery une partie synchrone du document. Au lieu d'utiliser DOM pour ajouter, utilisez quelque chose comme 'if (typeof jQuery ==" undefined ") document.write (''); Cela garantirait que jQuery est récupéré avant l'exécution d'autres scripts. –

+0

Merci ... ça l'a fait. Certainement pas aussi élégant, mais ça marche. Je souhaite que IE et FFX se comportent de manière cohérente sur le chargement de scripts externes, soupir. – Zendog74

1

La façon dont je suis autour était:

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

Il est pas joli mais ça fonctionne ... il fonctionne sur plusieurs fichiers, dans tous les navigateurs, je peux penser (que je me soucie) et signifie que vous n'avez pas à jouer avec le code source de la page parente. Donc, vous pouvez garder l'écart des tags.

Questions connexes