2012-07-06 7 views
6

Ich bin nicht genau sicher, wie meine Frage Begriff, mir ein Beispiel so lassen präsentieren:Wie kann ich einem Ereignis-Listener in der Initialisierungsfunktion eine Prototyp-Funktion hinzufügen?

function foo() { 
    window.addEventListener("keydown", function(event) { 
     bar(event.keycode); 
} 

foo.prototype.bar = function (keycode) { 
//code 
} 

Ich habe versucht this.bar() verwenden, aber das ergibt sich die window als this in Verwendung. Gibt es eine Möglichkeit, dies zu tun, oder muss ich eine andere Initialisierungsmethode manuell aufrufen?

Antwort

7

Binden Sie this.bar an this bevor Sie es übergeben.

function foo() { 
    window.addEventListener("keydown", this.bar.bind(this), false); 
} 


foo.prototype.bar = function (event) { 
    console.log(event.keyCode); 
} 

Demo http://jsfiddle.net/2tee4/

+0

Warum binden? 'window.addEventListener (" keydown ", this.bar, false);'? –

+1

@SheikhHeera, so dass 'bar' im Kontext von' this' aufgerufen wird, ansonsten wird es im globalen Umfang ausgeführt und es wird kein Vorteil sein, eine Prototyp-Funktion gebunden zu haben. – zzzzBov

+0

@SheikhHera '.bind' behebt' diesen' Wert, um immer gleich zu sein, egal wie die gebundene Funktion aufgerufen wird. In diesem Fall wird es immer das "foo" -Objekt sein. – Esailija

5

Eine alternative Lösung, wenn Sie nicht Function.prototype.bind verfügbar * haben, und Sie sind nicht bereit, zusätzliche Funktionen zu Function.prototype hinzuzufügen wäre, um den Anruf zu this.bar zu schließen über:

function foo() { 
    var self; 
    self = this; 
    window.addEventListener('keydown', function (e) { 
     self.bar(e); 
    }, false); 
} 
foo.prototype.bar = function (e) { 
    console.log(e.keyCode); 
} 

* obwohl die Nutzung von addEventListener ohne attachEvent führt mich zu glauben, dass Function.prototype.bind ein Zube wäre pTable Wahl


Zusätzlich Bibliotheken wie jQuery können ihre eigene Form der bind umfassen, ist jQuery jQuery.proxy.

+0

Danke für die zusätzlichen Optionen, es ist immer schön, mehr Informationen zu haben. Noch mehr, wenn dies ein Suchergebnis auf Google für jemand anderen ... – Bloodyaugust

4

Wenn Ihre Absicht, einen neuen Hörer für jeden foo erstellt hinzuzufügen ist, ist eine weitere Option foo implementieren die Eventlistener Schnittstelle zu machen, und einfach this anstelle des Handler übergeben.

function Foo() { 
    window.addEventListener("keydown", this, false); 
} 

Foo.prototype.bar = "foobar"; 

Foo.prototype.handleEvent = function(e) { 
    console.log(e.type); // "mousedown" (for example) 
    console.log(this.bar); // "foobar" 
}; 

new Foo(); 

Beachten Sie, dass dies nur mit addEventListener() funktioniert.

DEMO:http://jsfiddle.net/k93Pr/

+2

+1 wird, wäre es toll, wenn jQuery dies auch unterstützen würde, würde loswerden eine Menge '$ .proxy' Boilerplate für mich :) – Esailija

+0

Da der obige Kommentar upvoted wurde, werde ich mein Ticket verlinken: http://bugs.jquery.com/ticket/12031: P – Esailija

+1

@Esailija: Es wird interessant sein zu sehen, ob sie es implementieren. Ich würde jedoch nicht auf jQuery warten. Mach es einfach zu einem Plugin. Hier ist eine einfache und vielleicht naive erste Implementierung. Sie müssen lediglich Unterstützung für die anderen Signaturen von '.on()' hinzufügen. http://jsfiddle.net/suQEZ/ * (Ich weiß, dass du mich nicht gebraucht hast, um dir zu zeigen, wie es ist. Es ist mehr für andere.) * –

Verwandte Themen