2009-08-24 8 views
3

Ich habe eine Seite mit einigen jQuery und eine separate Nicht-jQuery-Funktion.Eigene Callbacks erstellen

Derzeit läuft meine Funktion auf $ (Dokument) .ready, aber ich möchte eine jQuery-Funktion aufrufen, sobald meine Funktion beendet ist. Ich kann meine Funktion als Rückruf an jede jQuery-Funktion weitergeben, aber wie kann ich das anders herum einrichten?

So würde Ich mag optimal wissen, wie eine Funktion foo erstellen, die sich um den für mich nehmen:

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

oder wie eine vorhandene Funktion erweitern Rückrufe zu handhaben. Vielen Dank.

Antwort

6

Definieren Sie Ihre Funktion, um einen (optionalen) Rückruf zu akzeptieren, und verwenden Sie dann die JavaScript-Methode call() oder apply(), wenn der Rückruf vorhanden ist. Um den Kontext beizubehalten, übergeben Sie den aktuellen Wert für this (oder den von Ihnen gewünschten Kontext) an die Methode apply. Call() und apply() unterscheiden sich je nachdem, wie Argumente übergeben werden.

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

Alles, was Sie tun müssen, ist Ihre benutzerdefinierte Methode zu erstellen, um eine andere Variable zu akzeptieren ... in diesem Fall eine Funktionsreferenz.

Wenn Sie so etwas wie dieses hatte:

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

einen Rückruf hinzuzufügen, würden Sie es so weit ändern:

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

(extrem schlechtes Beispiel, aber es erhält den Punkt herüber)

+1

diese lange genug mit jQuery tun, und Sie werden feststellen, dass der Kontext zu verlieren (diese) ein real werden wird Problem. – tvanfosson

2

Was funktions Verpackung:

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

Beispiel:

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

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