2009-08-24 6 views
3

J'ai une page avec quelques jQuery, et une fonction séparée non-jQuery.Création de mes propres callbacks

Actuellement, ma fonction s'exécute sur $ (document) .ready, mais je veux appeler une fonction jQuery dès que ma fonction est terminée. Je peux passer ma fonction comme rappel à n'importe quelle fonction jQuery, mais comment puis-je inverser les choses?

Je voudrais idéalement savoir comment créer une fonction foo qui prendra soin de cela pour moi:

$(document).ready(function() { 
    foo(myfunction(), $(bar).something); 
} 

ou comment étendre une fonction existante pour gérer callbacks. Merci.

Répondre

6

Définissez votre fonction pour accepter un rappel (facultatif), puis utilisez la méthode javascript call() ou apply() si le rappel existe. Pour conserver le contexte, transmettez la valeur actuelle this (ou le contexte souhaité) à la méthode apply. Call() et apply() diffèrent en fonction de la façon dont les arguments sont passés.

function myfunction(callback) { 
    // do stuff 
    if (callback) 
     callback.apply(this); 
} 
2

Tout ce que vous avez à faire est de créer votre méthode personnalisée pour accepter une autre variable ... dans ce cas, une référence de fonction.

Si vous aviez quelque chose comme ceci:

var add = function(a, b){ 
    return a+b; 
}; 

Pour ajouter un rappel, vous souhaitez changer à ceci:

var add = function(a, b, callback){ 
    callback(); 
    return a+b; 
}; 

(par exemple extrêmement pauvre, mais il obtient le point à travers)

+1

Faites ceci avec jQuery assez longtemps et vous verrez que perdre le contexte (ce) deviendra un véritable problème. – tvanfosson

2

Qu'en est fonction d'emballage:

Function.prototype.appendCallback = function(callback){ 
    var fn = this; 
    return function(){ 
    fn.apply(this, arguments); // execute original function 
    callback.call(this);   // then the callback 
    }; 
}; 

Exemple:

var newConfirm = window.confirm.appendCallback(function() { 
    alert('after from callback'); 
}); 

newConfirm('hello?'); // shows a confirmation, and then executes the callback. 
Questions connexes