2012-07-26 6 views
6

Ich bekomme die Grundidee über this nicht in einem method wenn in strict mode skizziert here, aber es wird ein bisschen gelehrt, um ehrlich zu sein. Also, in prosaischen Begriffe:jQuery Callback - strenge Verletzung

Ich habe einen Handler wie folgt:

$('.myClass').one('keyup', function() { 
    var $this = $(this); 
    etc etc 
}); 

ich es, dies ändern will:

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 

Es mag es nicht, weil in strict mode weil Ich verwende this außerhalb einer Methode. Ich verstehe das.

Ich brauche aber myFunction getrennt an den Handler zu haben, weil (1), um sie verschiedenen Klassen/Elemente angebracht ist und (2) Ich verwende .off().one('keyup', myFunction) die one Handler für verschiedene Klassen an verschiedenen Stellen zu setzen.

Also wie komme ich mit einer separaten Rückruffunktion ohne Verletzung der this Geschäft?

+0

Die akzeptierte Antwort auf die Frage Sie verknüpfen mit schlägt vor, die Funktionsanweisung durch einen Funktionsausdruck zu ersetzen. Hast du das versucht? –

+0

Verwenden Sie nicht den strikten Modus – Imdad

+0

Es ist nichts falsch daran, dies in einer Funktion zu verwenden. Da "Methoden" nicht wirklich zu Objekten gehören (sie sind nur Eigenschaften, die sich auf Funktionen beziehen, die _irgendwo_ definiert sind und möglicherweise mit anderen Objekten geteilt werden), sehe ich nicht, was der Einwand ist. – nnnnnn

Antwort

6

ich die Grundidee darüber nicht, wenn im Strict-Modus in einem Verfahren zu sein ...

Ja, aber Sie sind verwirrend zwei unabhängige Dinge: Strenger Modus und JSLint. Sie sind weitgehend unabhängig voneinander (außer dass JSLint eine Option für den strikten Modus hat).

Es gibt kein Problem mit Ihrem Code im strikten Modus. Es ist absolut gültig und angemessen (wegen der Art und Weise, wie jQuery this verwendet). Example Es gibt keine "strikte Verletzung" dort.

JSLint mag es nicht, aber JSLint mag nicht viele Dinge, die perfekt gültig und angemessen sind. JSLint erkennt eine Kombination von Dingen, die als Probleme weithin bekannt sind (wie fehlende Semikolons) und Dinge, die Douglas Crockford aus einer Perspektive nicht mag. Crockford ist intelligent und gut informiert, aber nicht alle sind mit seiner Stilwahl einverstanden.

Lint-Werkzeuge sind sehr hilfreich, ein wesentlicher Bestandteil des Toolkits. JSLint ist weniger hilfreich, als es (meiner Meinung nach) sein könnte, wenn man Substanzprobleme mit Stilproblemen zusammenführt (obwohl es eine feine Linie ist, mit JavaScript). Sie könnten in Betracht ziehen, JSHint zu verwenden, eine Verzweigung, die Ihnen mehr Kontrolle darüber gibt, was überprüft wird.

+0

Das ist wirklich hilfreich. Ich benutze Aptanas eingebaute JSLint, und der Fehler "strikte Verletzung" klang einfach so ... autoritativ :) – Nick

+0

@Nick: Ack! In der Tat, ich wusste nicht, dass es so formuliert ist (aber eine schnelle Überprüfung auf jslint.com bestätigt es). Klassisches Crockford ... :-) –

1

Können Sie das Ereignisobjekt nicht stattdessen verwenden?

, d.h.

function myFunction (e) { 
    var $this = $(e.currentTarget); 
}; 

Beispiel: http://jsfiddle.net/gRoberts/cRnb3/

+0

Nicht immer, sagt jQuery docs: 'event.target' zeigt das tiefste (innerste) Element an, wo das Ereignis aufgetreten ist, deshalb ist' this' nicht gleich 'event.target' wenn das Ereignis hat von einem Nachkommen Element gesprudelt. –

0

Sie die current des ereignis Objekt übergeben Trog lesen konnte, wie:

function myFunction (event) { 
    var $this = $(event.currentTarget); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 
0

Versuchen Sie, diese

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
var obj= $('.myClass1'); 
obj.myFunction =myFunction ; 

obj.one('keyup', myFunction); 
obj.one('keyup', myFunction); etc