Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   $(document).unbind(click) убивает live? (https://javascript.ru/forum/jquery/13797-%24-document-unbind-click-ubivaet-live.html)

JohnJ 14.12.2010 09:46

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

?
Как лучше выкрутиться?

exec 14.12.2010 09:52

Попробуйте применять unbind (и, есстественно, навешивать нужные обработчики) не к document, а к document.body.

JohnJ 14.12.2010 10:03

Благодарю, вроде как заработало :)
А где можно почитать на эту тему, чтобы понять в чём конкретно причина? Или это чисто по своему опыту с jQuery?

exec 14.12.2010 10:52

live вешает обычный обработчик события на document и смотрит, равен ли event.target (элемент, на котором произошло событие) заданному и если да, то выполняет ф-цию. unbind же снимает все обработчики с документа, в т. ч. и те, что навешаны через live. Вообще-то, для снятия live-обработчиков применяется метод die, но это только если снимать обработчик с обычного элемента, а не документа, unbind же не убивает live-события для них. А вот если сделать это с самим документом, то возникает такая вот заморочка.

PeaceCoder 14.12.2010 12:53

Цитата:

Сообщение от exec
unbind же снимает все обработчики с документа, в т. ч. и те, что навешаны через live

я бы сказал что это баг (недоработка). И таких недоработок в JQ не мало.

Kolyaj 14.12.2010 12:54

Вполне логичное поведение. Вы же не указываете, какой именно обработчик снять, поэтому снимаются все.

PeaceCoder 14.12.2010 14:09

Цитата:

Сообщение от Kolyaj
Вполне логичное поведение. Вы же не указываете, какой именно обработчик снять, поэтому снимаются все.

JQ должен предусматривать нетронутым live при вызове unbind на document, т.к. bind и live совсем разная идеология событий. Одно дело снять все "активные" события с документа, а другое дело снять все "живущие" события с других элементов, не касаемых документа вообще. Вот если вызывается $(document).die('click') тогда снимается и live события. Во всем должны быть рамки и наче будут вот такие как тут казузы.

JohnJ 29.12.2010 12:55

При использовании такого решения, как "document.body" - потом начались другие проблемы с другими плагинами. Помогло использование delegate() вместо live().

chosen 05.01.2011 19:38

если в коде приходится пользоватся .unbind то советую также использовать namespace
.live тоже должен их понимать


Часовой пояс GMT +3, время: 15:04.