2011-05-17 4 views
5

J'ai vu un code jquery sur le Net, quelque part, qui a pris cette forme:

<script>    
function doSomething(message) 
{ 
    $(document).ready(function(){  
     alert(message); 
     }); 
}; 
</script> 

dire une fonction externe ("doSomething") qui a $ (document) .ready à l'intérieur. Je suis confus parce que le code sous $ (document) .ready n'est pas déclenché quand le DOM est chargé? C'est comme avoir un gestionnaire d'événements dans une fonction (?). Est-ce que cette forme de code a du sens pour n'importe qui? Merci.

Répondre

4

Il s'agissait probablement d'une erreur de la part du codeur d'origine. Vous pouvez faire cela, mais vous voulez appeler doSomething assez tôt. Notez que si le DOM est déjà prêt lorsque vous appelez ready, jQuery appellera le code, donc cela arrivera de toute façon, mais cela n'arrivera pas tant que quelqu'un, quelque part, n'appellera pas doSomething. Je ne peux pas voir beaucoup de but pour le modèle, donc à moins que vous ayez un argument fort pour l'utiliser   — et étant donné la question, je soupçonne que vous n'avez pas :-)   — vous pouvez l'ignorer en toute sécurité.

+0

Je sais que c'est vieux, mais je Supposons que vous vouliez appeler un fichier XML/JSON juste au moment où la page est déclenchée, et que, une fois cette fonction terminée, mettez à jour certains éléments DOM avec la réponse reçue, si cette réponse est plus rapide que le chargement de page et les éléments DOM n'ont pas encore été chargés, ils ne sont pas mis à jour. être le rappel de succès et de travailler de cette façon? Donc, si cela se termine tôt, tout va encore fonctionner? – iLLin

+2

@iLLin: C'est un cas d'utilisation parfaitement raisonnable, je pense. Donc, vous déclenchez la requête ajax avec un script très haut dans le document (dans le 'chef', je pense), en utilisant' ready' dans le rappel de succès. Parfaitement raisonnable. Je ne suis pas sûr que la requête ajax arrivera un * lot * plus tôt que si vous placiez le script au bas de la balise 'body' (et que vous n'auriez pas à vous soucier de' ready'), mais pas nuire à ce que le navigateur sache rapidement ce que vous voulez qu'il fasse. –

+0

C'est exactement mon cas. – miguelsan

3

Est-ce que cette forme de code a du sens pour n'importe qui?

Non, ce n'est pas le cas.

8

Cela a du sens. $ (document) .ready enregistre un gestionnaire d'événements qui est déclenché lorsque le DOM est entièrement chargé. La fonction anonyme qui lui est transmise est ce gestionnaire. Si vous enregistrez ce gestionnaire après le chargement du DOM, il est immédiatement déclenché.

Javascript peut être exécuté avant que le DOM soit complètement chargé, donc ce que cette fonction fait, il enregistre réellement les messages qui ne doivent pas être montrés avant que le DOM soit chargé. Vous pouvez utiliser cette construction si vous ne voulez pas que le message soit affiché avant que le DOM soit entièrement chargé.

+1

+1 pour avoir trouvé * une * raison pour cela. :-) –

+0

Oui, je ne suis pas exactement sûr de la raison.Peut-être, le codeur d'origine a trouvé un navigateur qui arrête de rendre la page lorsqu'un message est affiché. Si cela arrivait, l'utilisateur regarde une page demi-rendue icky jusqu'à ce que les messages soient fermés. J'ai essayé si cela pouvait arriver. – GolezTrol

1

$ (document) .ready(); enregistre essentiellement la fonction à exécuter lorsque le DOM est prêt. Cependant dans ce cas, le programmeur avait imbriqué ceci dans la fonction. Cela signifie qu'il ne sera pas ajouté au .ready() jusqu'à ce qu'il fasse un appel à la fonction doSomething();

Vous pouvez l'essayer ce qui suit:

<script type="text/javascript"> 
    function doSomething(){ 
     $(document).ready(function(){ 
      alert('here'); 

     }); 
    } 
    doSomething(); 
</script> 

Placez ce à différentes parties de votre HTML et de le vérifier (:

Vive

Questions connexes