JQuery.data vs eventData

При настройке обработчика событий (submit, click, keypress, whatever) какой самый быстрый и эффективный способ получить данные в обработчике и использовать его в обработчике? Должен ли я делать что-то вроде:

$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;
});

Есть ли другие соображения, которые я опускаю?

Ответ 1

В любом случае вы сохраняете одни и те же данные в немного другом месте, хотя ваш первый может быть менее расточительным с помощью $.data() без создания объекта jQuery, например:

$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;
});

Ответ 2

По существу то же самое, но даже немного чище с . click (добавлено в jQuery 1.4.3):

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

Ответ 3

Немного поздно, но, возможно, полезно для кого-то.

Я бы сказал, это зависит. Если ваши данные являются окончательными при создании обработчика события (или объекта, который вы можете достичь из других областей вашего кода), второй метод является точным.

С другой стороны, если вы используете функцию $.data(), вы всегда будете ссылаться на фактические данные. Если данные могут быть изменены до того, как событие будет запущено.

Ответ 4

Существует другой метод: лучше, потому что вы можете получить доступ к свойствам данных с помощью предложения 'this':

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

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