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