jQuery .data vs eventData

时间:2010-07-14 15:44:07

标签: jquery events

设置事件处理程序(提交,单击,按键等)时,将数据提供给处理程序并在处理程序中使用它的最快,最有效的方法是什么?我应该这样做:

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

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

或者做这样的事情会更好:

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

我还有其他考虑因素吗?

4 个答案:

答案 0 :(得分:10)

无论哪种方式都有效,你将相同的数据存储在略微的不同位置,尽管使用$.data()可以减少浪费,而不需要创建jQuery对象,如下所示: / p>

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

就个人而言,我发现第二个更清洁,它的等效版本总体上也更短:

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

答案 1 :(得分:4)

基本上是相同的东西,但是.click(在jQuery 1.4.3中添加)更加清晰:

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

答案 2 :(得分:3)

有点晚,但也许对某人有用。

我想说这取决于。如果您的数据在创建事件处理程序(或者您可以从代码的其他区域到达的对象)时是最终的,那么第二种方法就可以了。

另一方面,如果使用$ .data()函数,您将始终引用实际数据。如果在触发事件之前可能更改了数据。

答案 3 :(得分:0)

还有另一种方法,它更好,因为您可以通过'this'子句访问数据属性:

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

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