Wie übergebe ich diesen Kontext in einen Event-Handler?
Ich weiß, diese Frage macht nicht viel Sinn, aber lassen Sie mich versuchen zu klären, ein bisschen.
Habe ich eine Klasse, genannt ScrollBanner, und es sieht etwas wie folgt aus (eine Menge, der Kürze halber weggelassen):
function ScrollBanner() {
this.initialize = function(selector) {
$('span#banner1-nav').click(this._onClickNavigation);
}
this._onClickNavigation = function(event) {
this.restartTimer(); //this == span#banner1-nav element from this.initialize
//...
}
this.restartTimer() {
//...
}
}
Wie Sie sehen können .initialisieren setzt einen click-handler zu ._onClickNavigation. Einige erwarten, dass die diese im event-handler zu finden, um die ScrollBanner Beispiel, aber leider tut es das nicht. Es bezieht sich auf das element, das trigerred das click-Ereignis, in diesem Fall span#banner1-nav
Was wäre der beste Weg, um diese verweisen auf die ScrollBanner Instanz der Klasse?
InformationsquelleAutor der Frage josef.van.niekerk | 2011-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die alten/traditionellen Weg:
Erfassen
this
in eine variable:Konnte Sie auch zuordnen
this
eine variable z.B.instance
:und beziehen sich auf
instance
stattthis
in aller Anrufe.Die Allgemeine Idee ist, um zu speichern
this
in eine variable in einem höheren Bereich.Den ECMAScript5 Weg:
ECMAScript5 führt eine neue Eigenschaft von Funktionen:
.bind()
. MDC-Dokumentation zeigt eine Umsetzung für Browser, die dies nicht unterstützen. Mit ihm können Sie binden einen bestimmten Kontext eine Funktion:aber hinter den kulissen ist es die gleiche Sache zu tun. Der Vorteil ist, dass Sie machen verwenden von built-in-Funktionalität in browser-Unterstützung ist.
Beachten Sie, dass dies unterscheidet sich von
apply
odercall
. Beide setzen den Rahmen und ausführen der Funktion, in der Erwägung, dassbind
legt nur den Rahmen, ohne die Ausführung der Funktion.Der jQuery-Weg:
jQuery stellt einen Methode
$.proxy()
, das gleiche zu tun:InformationsquelleAutor der Antwort Felix Kling
Ich weiß, das ist eine alte Frage, aber ich sah, dass in den Kommentaren, $.proxy() erwähnt wird. Ja, es verändert sich der Kontext eines Objekts, aber nicht in ein jQuery-event.
$.proxy() gibt die Funktion in dem Umfang, wie
this
laut aber dann, die Funktion wird zurückgegeben und vonclick()
welche dann ändert sich der Rahmen zu.selector
element.Getestet hab ich es vor einer minute aber wenn ich habe es falsch ist, bitte, sagen Sie
InformationsquelleAutor der Antwort Mario Legenda