2013-04-23 4 views
0

Salut là je found this snippet qui simule l'effet de la machine de frappe:Comment ajouter un rappel à cette fonction?

$.fn.teletype = function(opts){ 
    var $this = this, 
     defaults = { 
      animDelay: 50 
     }, 
     settings = $.extend(defaults, opts); 

    $.each(settings.text.split(''), function(i, letter){ 
     setTimeout(function(){ 
      $this.html($this.html() + letter); 
     }, settings.animDelay * i); 
    }); 
}; 

Wich semble fonctionner à merveille, mais je dois savoir quand la fonction est terminée, j'ai essayé d'ajouter un autre paramètre et l'exécuter à la fin de celui-ci :

$.fn.teletype = function(opts,callback){ 
    var $this = this, 
     defaults = { 
      animDelay: 50 
     }, 
     settings = $.extend(defaults, opts); 

    $.each(settings.text.split(''), function(i, letter){ 
     setTimeout(function(){ 
      $this.html($this.html() + letter); 
     }, settings.animDelay * i 
     callback(); 
    }); 
}; 

Mais son exécution avant la proccess terminé

Comment puis-je savoir où placer cette fonction de rappel?

+0

Vous Vous ne pouvez pas simplement le coller dans votre code tel quel, vous devrez le détecter lorsque tous les setTimeouts seront terminés. –

Répondre

1

Appel pour le dernier élément de la each, ce appellera le rappel après que l'animation a été appliquée à chaque lettre

$.fn.teletype = function(opts,callback){ 
    var $this = this, 
     defaults = { 
      animDelay: 50 
     }, 
     settings = $.extend(defaults, opts); 


    $.each(settings.text.split(''), function(i, letter){ 
     setTimeout(function(){ 
      $this.html($this.html() + letter); 
      if(i === (settings.text.length -1)) { 
       callback(); 
      } 
     }, settings.animDelay * i 
    }); 

}; 
+1

Cela arrivera encore trop tôt. –

+0

Désolé .. mal compris la question, j'ai mis à jour ma réponse – cfs

+0

apparemment votre édition n'a pas réellement compté comme un montage, donc je ne peux pas annuler le vote. –

0

Vérifiez l'état à l'intérieur du rappel setTimeout:

$.each(settings.text.split(''), function(i, letter){ 
    setTimeout(function(i){ 
     $this.html($this.html() + letter); 
     if(i == (settings.text.length -1)){ 

      callback() 

     } 
    }, settings.animDelay * i 

}); 
+0

cela appellera le callback() deux fois – cfs

+0

@cfs, désolé, j'ai oublié de supprimer le second 'callback()' de la question OP. – moonwave99

+2

@ moonwave99 "bonne peine ..." – Dom

Questions connexes