2012-07-26 3 views
6

Je reçois l'idée de base sur this ne pas être dans un method quand strict mode a souligné here, mais il devient un peu érudit, pour être honnête. Ainsi, en plus prosaïques termes:jQuery rappel - violation stricte

J'ai un gestionnaire comme ceci:

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

Je veux changer à ceci:

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

Il ne l'aime pas parce que dans strict mode parce que J'utilise this en dehors d'une méthode. Je comprends ça.

Cependant, je dois avoir myFunction séparé au gestionnaire, parce que (1) il est attaché à différentes classes/éléments et (2) J'utilise .off().one('keyup', myFunction) pour réinitialiser le gestionnaire one pour différentes classes à différents points.

Alors, comment puis-je avoir une fonction de rappel distincte sans violer l'entreprise this?

+0

La réponse acceptée à la question vous liez à suggère de remplacer l'instruction de fonction par une expression de fonction. Avez-vous essayé cela? –

+0

Ne pas utiliser le mode strict – Imdad

+0

Il n'y a rien de mal à l'utiliser dans une fonction. Étant donné que les "méthodes" n'appartiennent pas vraiment aux objets (ce ne sont que des propriétés qui font référence à des fonctions définies _par ailleurs, et éventuellement partagées avec d'autres objets), je ne vois pas quelle est l'objection. – nnnnnn

Répondre

6

Je reçois l'idée de base sur ce qui est pas dans une méthode en mode strict ...

Oui, mais vous confondez deux choses sans rapport: mode strict et JSLint. Ils sont largement indépendants (sauf que JSLint a une option pour exiger le mode strict).

Il n'y a pas de problème avec votre code en mode strict. C'est parfaitement valide et approprié (à cause de la façon dont jQuery utilise this). Example Il y a non "violation stricte" là. JSLint ne l'aime pas, mais JSLint n'aime pas beaucoup de choses qui sont parfaitement valables et appropriées. JSLint détecte une combinaison de choses qui sont très largement reconnues comme étant des problèmes (comme des points-virgules manquants), et des choses que Douglas Crockford n'aime pas du point de vue style. Crockford est intelligent et bien informé, mais tout le monde n'est pas d'accord avec ses choix de style.

Les outils anti-peluches sont très utiles, une partie essentielle de la boîte à outils. JSLint est moins utile que cela pourrait être (à mon avis), en confondant les problèmes de substance avec les problèmes de style (bien que ce soit une ligne fine, avec JavaScript). Vous pourriez envisager d'utiliser JSHint, une fourche qui vous donne plus de contrôle sur ce qu'il vérifie. Vous ne pouvez pas utiliser l'objet événement à la place?

+0

Ceci est vraiment utile. J'utilise JSLint intégré d'Aptana, et l'erreur "violation stricte" sonnait juste tellement ... autoritaire :) – Nick

+0

@Nick: Ack! En effet, je ne me suis pas rendu compte que c'était formulé comme ça (mais une vérification rapide sur jslint.com le confirme). Classic Crockford ... :-) –

1

c.-à-d.

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

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

+0

Pas toujours, dit jQuery docs: 'event.target' indique l'élément le plus profond (le plus profond) où l'événement s'est produit, donc' this' peut ne pas être égal à 'event.target' si l'événement a fait des bulles à partir d'un élément descendant. –

0

vous pouvez lire le currentTarget de l'événement objet creux passé, comme:

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

Essayez cette

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

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