2010-11-12 37 views
1

J'ai javascript placé dans la fonction jquery $ (document) .ready. Il recherche une ancre dans l'URL, puis exécute une fonction distincte pour afficher le contenu correspondant.jquery fonction prête non exécutable

Le code s'exécute si je place une alerte à l'intérieur de l'instruction if quelque part, mais ne courra pas autrement. J'ai stocké tous les noms d'ancre dans un tableau appelé 'anchorNameList', et je vérifie pour voir si l'ancre dans l'URL existe. Je veux seulement que la fonction s'exécute sur le pageload initial, donc je mets la valeur par défaut de 'currentAnchor' à 1000 et la change à chaque itération.

 if (currentAnchor == 1000 && document.location.hash.substring(1)) { 
     var checkForThisAnchor = document.location.hash.substring(1); 
     for (var j=0; j < anchorNameList.length; j++) { 
      if (anchorNameList[j] == checkForThisAnchor) { 
       expandMe(j); 
      } 
     } 
    } 
+0

Si cela fonctionne lorsque vous placez des moyens d'alerte, il y a un problème de synchronisation. – kobe

+0

Votre tag de script jQuery est-il avant ou après votre propre balise de script de fichier JS? Il doit venir avant. –

+0

Le script jQuery est appelé dans l'en-tête. La fonction expandMe que j'appelle est définie au-dessus de la fonction ready. Essentiellement, l'ordre sur la page est: head -> (jQuery reference) body -> (fonction expandMe, $ (document) .ready et le contenu inclus). Devrais-je réorganiser la commande? –

Répondre

0

J'ai basculé l'événement onload de document.ready de jQuery à window.ready. Cela fonctionnait correctement dans environ 30% des cas, ce qui posait certainement un problème de synchronisation. Il semblait que la principale fonction JavaScript de la page, qui récupérait les éléments de la liste, fonctionnait lentement. Je viens de déplacer toute cette fonction d'expansion à la fin de cette fonction de récupération de liste, de sorte qu'elle fonctionne simplement linéairement.

0

Dans mon expérience, quand un problème JavaScript se fixe comme par magie en ajoutant une alerte anodine() quelque part, la source du problème est généralement une requête asynchrone.

Dans des circonstances non-alert, la demande asynchrone n'est pas encore terminée. Mais en ajoutant l'alerte, il a une chance de finir, et donc de permettre à votre code de parcourir un chemin de code différent de celui qu'il aurait atteint sans la réponse de l'appel asynchrone complet.