2010-06-18 10 views
1

Quelqu'un peut-il me dire pourquoi la fonction de document prêt a besoin d'un appel pour fonctionner en premier? On m'a dit que setTimeout dans le premier exemple ci-dessous (qui ne fonctionne pas) serait évalué et passé à ready, mais je ne vois pas quelle serait la différence pour l'appel de fonction dans le second exemple (qui fonctionne) ?Fonction jQuery ready

$(document).ready(
    setTimeout(
     function(){ 
      $('#set_3').innerfade({ 
       animationtype: 'fade', 
       speed: 'slow', 
       timeout: 3000, 
       type: 'sequence', 
       containerheight: '180' }); 
     }, 
     2000); 
); 


$(document).ready( 
    function(){ 
     setTimeout(
      function(){ 
       $('#set_3').innerfade({ 
        animationtype: 'fade', 
        speed: 'slow', 
        timeout: 3000, 
        type: 'sequence', 
        containerheight: '180' }); 
      }, 
      2000); 
    } 
); 
​ 

Répondre

6

Ce dernier définit une fonction qui sera appelée lorsque le document est prêt, et passe ce que l'argument $(document).ready(). Dans le premier, l'argument qui est passé à $(document).ready() est le résultat de l'évaluation de votre commande setTimeout, donc oui, dans le premier cas, l'appel setTimeout est immédiat.

+2

... qui peut conduire à des erreurs si l'élément $ ('# set_3') n'est pas chargé après 2 secondes. Généralement, le premier appel ne me rend absolument aucun service. –

+1

... dans le premier cas, il n'y a aucun point pour le ['$ (document) .ready();'] (http://api.jquery.com/ready) car il ne sait pas quoi faire avec l'entier renvoyé par ['setTimeout()'] (https://developer.mozilla.org/en/window.setTimeout) – gnarf

4

Vous devez transmettre un rappel à ready(). setTimeout ne renvoie pas un rappel, la façon dont vous l'avez il est exécuté immédiatement, et son résultat passé en tant qu'argument à la fonction ready. Ce n'est pas ce que tu veux. Il suffit de l'entourer d'un function() { } et cela fonctionnera.

2

jQuery attend une fonction anonyme qu'il peut appeler.

http://api.jquery.com/ready/

+2

toute fonction fonctionnerait, ne doit pas être anonyme – Anurag

+0

Dire qu'il a besoin d'une fonction anonyme est quelque peu trompeur. Faire ce qui suit fonctionne très bien: 'function namedf() {alert (" hello "})); $ (document) .ready (namedef) 'Bien qu'une fois passée, jquery n'appelle pas la fonction par son nom, cette fonction n'est pas vraiment anonyme. –

0

La fonction que vous fournissez est un rappel qui est exécutée lorsque le DOM est prêt (ne peut pas être encore chargé la page entière).

2

Vous devez passer un délégué à la fonction prêt:

$(document).ready(function() { 
    // Do something 
}); 

Ou simplement:

$(function() { 
    // Do something 
}); 
3

Considérons un exemple plus simple.

function f (g) { 
    g(); 
} 

Cette fonction f accepte une fonction paramètre g et appelle. Par conséquent, nous nous attendons à g être une fonction.

maintenant

f (alert("Wrong")); 

est équivalent à

var param = alert("Wrong"); 
f(param); 

Vous voyez, dans la première ligne de la zone d'alerte (comme l'instruction est évaluée) sera affiché et revenir undefined-param. Mais f attend une fonction, pas un .

Une fonction est nécessaire.Une façon est de créer un:

function param() { alert("Right"); } 
f(param); 

Mais Javascript prend également en charge des fonctions anonymes, sous la forme

var param = function() { alert("Right"); } 
f(param); 

éliminer maintenant la variable param vous obtiendrez

f(function() { alert("Right"); }); 

Correspondant à votre question, f est $(document).ready et alert est cette fonction setTimeout.

+0

+1 excellente explication bro! ;) –

0

Non, cela ne fonctionne pas, du moins pas de la même manière. Même si le minuteur est démarré dans le premier exemple, il ne démarre pas lorsque l'événement ready se produit.

Dans le premier exemple, la méthode ready est appelée avec le résultat de la méthode setTimeout. Comme setTimeout retourne une poignée pour le délai d'attente et non un délégué que la méthode ready peut utiliser, il est le même que:

setTimeout(
    function(){ 
     $('#set_3').innerfade({ 
      animationtype: 'fade', 
      speed: 'slow', 
      timeout: 3000, 
      type: 'sequence', 
      containerheight: '180' }); 
    }, 
    2000); 

$(document).ready(); 

Ainsi, la méthode setTimeout est appelée immédiatement, et l'appel à ready n'a pas d'effet du tout .

Questions connexes