Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.12.2010, 09:46
Новичок на форуме
Отправить личное сообщение для JohnJ Посмотреть профиль Найти все сообщения от JohnJ
 
Регистрация: 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) {...});

?
Как лучше выкрутиться?
Ответить с цитированием
  #2 (permalink)  
Старый 14.12.2010, 09:52
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Попробуйте применять unbind (и, есстественно, навешивать нужные обработчики) не к document, а к document.body.
Ответить с цитированием
  #3 (permalink)  
Старый 14.12.2010, 10:03
Новичок на форуме
Отправить личное сообщение для JohnJ Посмотреть профиль Найти все сообщения от JohnJ
 
Регистрация: 14.12.2010
Сообщений: 3

Благодарю, вроде как заработало
А где можно почитать на эту тему, чтобы понять в чём конкретно причина? Или это чисто по своему опыту с jQuery?
Ответить с цитированием
  #4 (permalink)  
Старый 14.12.2010, 10:52
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

Последний раз редактировалось exec, 14.12.2010 в 10:54.
Ответить с цитированием
  #5 (permalink)  
Старый 14.12.2010, 12:53
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от exec
unbind же снимает все обработчики с документа, в т. ч. и те, что навешаны через live
я бы сказал что это баг (недоработка). И таких недоработок в JQ не мало.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
  #6 (permalink)  
Старый 14.12.2010, 12:54
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Вполне логичное поведение. Вы же не указываете, какой именно обработчик снять, поэтому снимаются все.
Ответить с цитированием
  #7 (permalink)  
Старый 14.12.2010, 14:09
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 29.12.2010, 12:55
Новичок на форуме
Отправить личное сообщение для JohnJ Посмотреть профиль Найти все сообщения от JohnJ
 
Регистрация: 14.12.2010
Сообщений: 3

При использовании такого решения, как "document.body" - потом начались другие проблемы с другими плагинами. Помогло использование delegate() вместо live().
Ответить с цитированием
  #9 (permalink)  
Старый 05.01.2011, 19:38
Новичок на форуме
Отправить личное сообщение для chosen Посмотреть профиль Найти все сообщения от chosen
 
Регистрация: 05.11.2009
Сообщений: 9

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jquery live не всегда срабатывает JIEXA jQuery 5 25.10.2010 18:50
live() не работает Viper jQuery 0 09.09.2010 15:57
jquery и live herba jQuery 2 19.06.2010 14:00
live click выполняется несколько раз hara jQuery 9 09.06.2010 10:58
live & change Jaska jQuery 11 02.10.2009 21:20