14.12.2010, 09:46
|
Новичок на форуме
|
|
Регистрация: 14.12.2010
Сообщений: 3
|
|
$(document).unbind(click) убивает live?
Здравствуйте.
Подскажите, почему такая конструкция из jquery.contextMenu.js
$(document).click( function() {
$(document).unbind('click').unbind('keypress'); // когда комментирую эту строку, всё работает, за исключением нормальной функциональности контекстного меню, естественно (оно сразу скрывается при открытии, так как событие click обрабатывается и при нажатии правой кнопки мышки...
$(menu).fadeOut(o.outSpeed);
return false;
});
приводит после первого открывания контекстного меню и щелчке по "документу" к неработоспособности такой конструкции:
$('#panel > div.myclass').live('click', function(e) {...});
?
Как лучше выкрутиться?
|
|
14.12.2010, 09:52
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
Попробуйте применять unbind (и, есстественно, навешивать нужные обработчики) не к document, а к document.body.
|
|
14.12.2010, 10:03
|
Новичок на форуме
|
|
Регистрация: 14.12.2010
Сообщений: 3
|
|
Благодарю, вроде как заработало
А где можно почитать на эту тему, чтобы понять в чём конкретно причина? Или это чисто по своему опыту с jQuery?
|
|
14.12.2010, 10:52
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
live вешает обычный обработчик события на document и смотрит, равен ли event.target (элемент, на котором произошло событие) заданному и если да, то выполняет ф-цию. unbind же снимает все обработчики с документа, в т. ч. и те, что навешаны через live. Вообще-то, для снятия live-обработчиков применяется метод die, но это только если снимать обработчик с обычного элемента, а не документа, unbind же не убивает live-события для них. А вот если сделать это с самим документом, то возникает такая вот заморочка.
Последний раз редактировалось exec, 14.12.2010 в 10:54.
|
|
14.12.2010, 12:53
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Сообщение от exec
|
unbind же снимает все обработчики с документа, в т. ч. и те, что навешаны через live
|
я бы сказал что это баг (недоработка). И таких недоработок в JQ не мало.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
|
|
14.12.2010, 12:54
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Вполне логичное поведение. Вы же не указываете, какой именно обработчик снять, поэтому снимаются все.
|
|
14.12.2010, 14:09
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Сообщение от Kolyaj
|
Вполне логичное поведение. Вы же не указываете, какой именно обработчик снять, поэтому снимаются все.
|
JQ должен предусматривать нетронутым live при вызове unbind на document, т.к. bind и live совсем разная идеология событий. Одно дело снять все "активные" события с документа, а другое дело снять все "живущие" события с других элементов, не касаемых документа вообще. Вот если вызывается $(document).die('click') тогда снимается и live события. Во всем должны быть рамки и наче будут вот такие как тут казузы.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Последний раз редактировалось PeaceCoder, 14.12.2010 в 14:11.
|
|
29.12.2010, 12:55
|
Новичок на форуме
|
|
Регистрация: 14.12.2010
Сообщений: 3
|
|
При использовании такого решения, как "document.body" - потом начались другие проблемы с другими плагинами. Помогло использование delegate() вместо live().
|
|
05.01.2011, 19:38
|
Новичок на форуме
|
|
Регистрация: 05.11.2009
Сообщений: 9
|
|
если в коде приходится пользоватся .unbind то советую также использовать namespace
.live тоже должен их понимать
|
|
|
|