2010-12-23 3 views
0

Über XBL spricht nicht gerade über Javascript sprechen. Also werde ich diese Frage erstellen, die mit this one verwandt ist, aber jetzt über XBL, wo ich nicht der Ersteller des Root-JavaScript-Codes bin, sondern nur der Methoden und Event-Handler innerhalb der Bindungen.Der beste Ansatz, um Javascript zu vermeiden "diese" Fehler in XBL

-

In einigen Fällen kann das this Schlüsselwort auf das Objekt beziehen kann ich nicht erwarten, dass es zu. (Aktuelles Beispiel: in an key event, in my XBL)

Was ist der beste Ansatz ist, diese Art von Fehler zu vermeiden

Vorerst bin ich mit der immer getElementById (oder $.fn von jQuery), aber ich bin mir nicht sicher, ob es das ist beste Ansatz

--update

ein wenig mehr Details.

Innerhalb eines XBL method der einzige Weg, auf das Element zuzugreifen, das in der Datei Xul definiert wurde (die GUI-Beschreibungsdatei), ohne "this" zu verwenden (da es nicht das erwartete "this" ist), mit getElementById, und das macht den Code nicht wiederverwendbar Ich suche nach Alternativen ..

Antwort

1

Wie Sie an anderer Stelle gehört haben, ist das Problem, dass der this Parameter nicht unbedingt das Objekt ist, an das Sie zuerst gedacht haben, besonders wenn Sie über Event-Handler und dergleichen sprechen. Der beste Weg, den ich fand, ist, eine kleine Funktion zu schreiben, die irgendein Objekt als die this Variable bindet und eine andere Funktion zurückgibt, die die Bindung benutzt, um die ursprüngliche Funktion anzurufen.

an diesem Code Werfen Sie einen Blick:

var bindFunction = function(self, f) { 
    return function() { 
    return f.apply(self); 
    }; 
}; 

var foo = function() { 
    alert(this.hello); 
}; 

var bar = { 
    hello: "Hello there" 
}; 

var boundFoo = bindFunction(bar, foo); 
boundFoo(); 

Was ich habe eine Funktion bindFunction genannt ist, die ein Objekt nimmt (genannt self) und eine Funktion, und gibt eine weitere Funktion, die die übergebenen in Funktion aufruft Anwenden des self Objekts als die this Variable.

Der Rest des Codes ist nur einiger Testcode: eine foo Funktion, die this.hello, ein bar Objekt mit einem hello Mitglied aufmerksam wird, und wie Sie foo mit bar binden können.

Im Wesentlichen habe ich eine Funktion übernommen, die keine Parameter akzeptiert und eine andere Funktion generiert, die sicherstellt, dass die erste immer mit der korrekten this Variablen aufgerufen wird. Ideal für Eventhandler.

(Sorry, aber ich weiß nichts über XBL, so hoffe ich, dies von Nutzen sein wird.)

+0

'bind' in EcmaScript gebaut 5, und die neue' strict' Modus macht eine Menge 'diese 'Probleme scheitern schnell. –

+0

Danke für die Antwort, in Ihrem Beispiel haben Sie die "Leiste" als "self" zu verwenden, aber innerhalb einer [XBL-Methode] (https://developer.mozilla.org/en/XUL_Tutorial:Adding_Methods_to_XBL-defined_Elements) der einzige Weg Der Zugriff auf das Element, das in der [Xul] (https://developer.mozilla.org/en/XUL) -Datei (der GUI-Beschreibungsdatei) definiert wurde, erfolgt mit getElementById, und das macht den Code nicht wiederverwendbar, also bin ich Suche nach Alternativen .. –

+1

Anstatt OtherDoc.addEventListener zu schreiben ("event", this.myMethod, false); du schreibst jetzt otherDoc.addEventListener ("event", this.bindFunction (this, this.myMethod), false); – Neil

0

Wenn es keine beste Antwort, ein guter Ansatz zu verwenden JavaScript-Dateien anstelle von XBL für die Umsetzung sein könnte. Wenn man den Quellcode von Xulrunner betrachtet, sieht es so aus, als ob der meiste Code dies tut.

Aber ich möchte noch XBL verwenden, wenn es eine Möglichkeit war gut mit ihm zu arbeiten ..

Verwandte Themen