2010-07-14 3 views
11

Lors de la configuration d'un gestionnaire d'événements (soumettre, cliquer, appuyer sur, quel qu'il soit), quel est le moyen le plus rapide et le plus efficace d'obtenir des données pour le gestionnaire et de les utiliser dans le gestionnaire? Dois-je faire quelque chose comme:jQuery .data vs eventData

$obj.data({name: value, ...}); 

$obj.click(function(e){ 
    var $this = $(e.target), 
    name = $this.data(name); 
}); 

Ou est-il préférable de faire quelque chose comme ceci:

$obj.bind('click', {name: value}, function(e) { 
    var $this = $(e.target), 
    name = e.data.name; 
}); 

Y at-il d'autres considérations que je suis OMETTANT?

Répondre

10

fonctionne toute façon, vous stockez les mêmes données dans un légèrement endroit différent, bien que votre première peut être moins de gaspillage en utilisant $.data() sans créer un objet jQuery, comme ceci:

$obj.data({ name: value }); 
$obj.click(function(e) { 
    var name = $.data(this, 'name'); 
}); 

Personnellement, Je trouve le deuxième ensemble beaucoup plus propre, il est version équivalente est plus courte ainsi:

$obj.bind('click', {name: value}, function(e) { 
    var name = e.data.name; 
}); 
+0

Oui, je suppose que pour l'exemple, il était hors de propos, je coupe juste de mon code où je trouve que je le crée presque toujours. – craveytrain

4

essentiellement la même chose, mais même un peu plus propre avec .click (ajouté à jQuery 1.4.3):

$obj.click({name: value}, function(e) { 
    var name = e.data.name; 
}); 
3

Un peu en retard mais peut-être utile pour quelqu'un.

Je dirais que ça dépend. Si vos données sont définitives lors de la création du gestionnaire d'événements (ou d'un objet que vous pouvez atteindre à partir d'autres zones de votre code), la deuxième méthode est correcte. Par contre, si vous utilisez la fonction $ .data(), vous référerez toujours aux données réelles. Par contre, si vous utilisez la fonction $ .data(), Si les données peuvent être modifiées avant le déclenchement de l'événement.

0

Il existe une autre méthode, il est préférable parce que vous pouvez accéder aux propriétés de données via 'cette clause:

 var tst = { 
      a:1, 
      b:2, 
      clickHandler: function(e) { 
       alert(this.a); 
       alert($(e.target).attr('id')); 
      } 
     }; 

     $('#btn').click(tst.clickHandler.bind(tst));