2012-07-27 1 views
3

Я знаю, как jQuery 1.7, метод .live() устарел. Так вот что я придумал:jQuery live() vs on() in 1.7+

$(document.body).on('click', '#list', function() { 
    console.log($(this)); 
}); 

Который довольно много делает трюк и эквивалентно:

$('#list').live('click', function(){ 
    console.log($(this)); 
}); 

Они оба возвращают #list JQuery объект, который является то, что я хотел , Проблема, однако, когда я передать объект JQuery в качестве второго параметра, вместо строки (что случается довольно часто), например:

var list = $('#list'); 
$(document.body).on('click', list, function() { 
    console.log($(this)); 
}); 

Консоль возвращает $ (тело) JQuery объект. Что бесполезно в этом вопросе. ;) Любые идеи?

EDIT: Проблема здесь НЕ как получить доступ к пораженной объект $ («# список») из примера 1 и 2, но как получить к нему доступ в примере 3.

+0

Можно создать дубликат: http://stackoverflow.com/questions/8042576/whats-the-difference-between-jquery-live-and-on –

+1

Не думаю. Я описал свою проблему относительно доступа к объекту, затронутому событиями, а не к различию между этими двумя методами. – acid

+0

Консоль возвращает именно то, что ожидается $ (это) относится к document.body в этом случае – AbstractChaos

ответ

3

Довольно ясный ответ вы будет найти в официальном docs:

Использование метода .live() больше не рекомендуется, так как более поздние версии JQuery предлагают более эффективные методы, которые не имеют своих недостатки. В частности, следующие проблемы возникают при использовании .live():

  • JQuery пытается извлечь элементы, указанных в селекторе перед вызовом .live() метода, который может быть много времени на больших документах.
  • Цепочки не поддерживаются. Например, $("a").find(".offsite, .external").live(...);: не действительный и не работает должным образом.
  • Поскольку все .live() событий прикреплены к элементу document, события занимают самое длинное и самое медленное возможный путь, прежде чем они будут обработаны.
  • Вызов event.stopPropagation() в обработчике событий недействителен при остановке обработчиков событий прилагается ниже в документе; событие уже распространилось до document.
  • .live() метод взаимодействует с другими методами событий способов, которые могут быть удивительно, например, $(document).unbind("click") удаляет все обработчик кликов присоединенных любой вызовом .live()!
1

Это просто некорректно передать объект в качестве второго параметра в on.

Из docs:

.on(events [, selector] [, data], handler(eventObject))

Он просит селектор, а не объект JQuery, так что вам нужно использовать:

$(document.body).on('click', '#list', function() { 
    console.log($(this)); 
}); 
+0

Итак, как мне получить доступ к селектору, который относится к нему (если, например, есть братья и сестры)? – acid

+0

Как и в случае, если есть другие элементы списка, которые будут соответствовать селектору? '$ (this)' будет ссылаться на тот, который был нажат. – bcmcfc

+0

Я добавил редактирование в первом сообщении, надеюсь, что это я покажу вам проблему. («Проблема здесь не в том, как получить доступ к затронутому объекту $ ('# list') из примеров 1 и 2, но как получить к нему доступ в примере 3.») – acid