События jQuery остаются с документом после выключения - PullRequest
1 голос
/ 13 марта 2012

Я создаю BHO и вставляю скрипты в страницы Facebook .. Мой вопрос заключается в следующем.Иногда, когда я вставляю скрипт в страницу (скажем) и привязываю некоторые события к держателю события, например

 $('#contentArea').on('click','#myId',Dosomething); 

, они работают нормально.

После этого я удаляю скрипты из этогостраницы, а затем добавьте их снова (пожалуйста, не спрашивайте почему, это потому, что facebook не всегда генерирует новый документ для новой страницы, а изменяет часть документа), и этовремя запуска событий несколько раз (зависит от того, сколько раз я удаляю и затем добавляю их, поэтому для 1 удаления и 1 добавления они запускаются дважды, для 2 удаления и 2 добавления они запускаются 3 раза и т. д.), несмотря на то, что первыйСтрока сценария:

 $('#contentArea').off();

Чего мне здесь не хватает, потому что я знаю, что обработчики не удаляются из документа или из узла ... может быть, это проблема с пузырьками событий?Кстати, я работаю в internet explorer 9.

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

я думаю, ты должен хотя бы сделать

 $('#contentArea').off("click");

или слушатель события не может быть удален, может быть, даже

$('#contentArea').on('click','#myId'); 
0 голосов
/ 05 октября 2012

Лучшее решение - почему вы сначала не проверяете элемент, чтобы увидеть, есть ли у него обработчик? Как можно выполнить такую ​​задачу? Легко, мы оставляем след на элементе, который сообщает нам, установили ли мы обработчик или нет. В конце концов, элемент является dom, поэтому мы можем просто добавить к нему элемент объекта или добавить атрибут

$(this).attr('myBHOInstalled','true');

тогда

if( $(this).attr('myBHOInstalled') !== 'true' ) {
    installMyBHO($(this)); 

}

0 голосов
/ 13 марта 2012

Согласно документации API off () требует, по крайней мере, один аргумент.

события Один или несколько типов событий, разделенных пробелами, и необязательных пространств имен,или просто пространства имен, такие как «click», «keydown.myPlugin» или «.myPlugin».

Попробуйте отменить привязку всех событий click таким образом;$('#contentArea').off('click');

Вы также можете использовать unbind () для отмены привязки всех событий.

В простейшем случае без аргументов .unbind() удаляет все обработчики, прикрепленные к элементам.

0 голосов
/ 13 марта 2012

Если цель состоит в том, чтобы удалить делегированный обработчик, который вызывает функцию, вам, вероятно, следует удалить функцию, связанную с этим событием и элементом?

$('#contentArea').off('click','#myId',Dosomething); 
...