Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Удаление обработчиков установленных addEventListener, (https://javascript.ru/forum/events/21829-udalenie-obrabotchikov-ustanovlennykh-addeventlistener.html)

Jamshut 26.09.2011 03:50

Удаление обработчиков установленных addEventListener,
 
f_AddEvent = function(v_target_o,v_name_s,v_handler_f)
{ 
  if(v_target_o.addEventListener)
  {
    v_target_o.addEventListener(v_name_s,v_handler_f,false);
  }
  else if(v_target_o.attachEvent)
  {
    v_target_o.attachEvent('on'+v_name_s,v_handler_f);
  };
};

суть вопроса такая:
- если обработчик устанавливается этой функцией
- я не знаю и не имею ссылки на v_handler_f чтоб удалить обработчик методами removeEventListener("типCобытия", функцияПолучателяСобытия, захват); detachEvent("имяСобытия", ссылкаНаФункцию);

мож есть какие обьекты где можно поймать список функций обработчаков для событий обьекта v_target_o, сам v_target_o не хранит такой инфы, пытался посмотреть обьект события определенного типа возникающего на данном v_target_o, (этот вариант лучше проверить нужно)

пытаюсь искать информацию в обьекте obj очень просто:
var str='';for(i in obj){try{str += i+' = '+obj[i]+';   ';}catch(e){};};alert(str);

может как то перебрать все функции, но где взять список ссылок на все функции и не факт что они определены глобально (
v_target_o.addEventListener('click',function(){bla bla},false);
) типа такого:

for(i in functions_list)
{
  try
   {
      v_target_o.removeEventListener("click", functions_list[i], false);
   }
   catch(e){};
};




Ну и еще вопрос, в каком отладчике и где можно увидеть обработчики событий установленные на элементе таким методом (функцией f_AddEvent) ? Вроде в фаербаге собирались ввести подобное.

da_ff 26.09.2011 11:14

Если вам требуется удалить все обработчики с объекта, то делайте следующим образом. Вешайте на событие объекта свою функцию (назовем ее служебной), а те функциии, что требуются для работы складывайте в массив. При срабатывании служебной функции проходите по массиву и выполняйте навешанные функции. Чтобы исключить все функции из обработки, просто очистите массив. Для удаления обработчика исключите отдельный элемент из массива. Этим способом вы так же можете решить проблему контекста this для обработчиков событий в ie. Где хранить массив функций решайте сами.

Jamshut 26.09.2011 13:28

Спасибо за ответ, но данный вариант не подходит, представим, что у меня универсальный скрипт который должен работать на страницах написанных не мной, здесь как раз и возникает озвученная проблема, как перехватить чужие обработчики и не нарушить работоспособность страницы.

если бы было можно потерять чужие обработчики то можно сделать так
v_target_o.parentNode.innerHTML = v_target_o.parentNode.innerHTML;

все обработчики внутри кода бы потерялись

Вопрос этот скорее из разряда изобретения велосипеда но разобраться в таких нюансах языка будет полезно


Про мониторинг событий в отладчике тож остается открытым


заранее спасибо

da_ff 27.09.2011 11:00

>разобраться в таких нюансах языка будет полезно
Язык тут ни при чем?! Это DOM.

Jamshut 28.09.2011 12:39

та не, это никакой не DOM)))

Kolyaj 28.09.2011 13:08

Та не, это всё-таки DOM.

Jamshut 28.09.2011 23:17

а, ну если Вы имеете ввиду что это связано с объектами в DOM, их свойствами и методами, то да, мне поначалу показалось такое утверждение нелепым, потому что браузерный JS и есть связка JS и DOM, но соглашусь тогда что концептуально я неправ был - "Язык тут ни при чем?! Это DOM" спасибо, капитан очевидность.

da_ff 29.09.2011 10:55

Jamshut,
Обращайтесь!
Всегда ваш К.О.

P.S. Вообще, написал я это с предложением посмотреть стандарт DOM.

Jamshut 29.09.2011 18:18

ок ))) но вопрос интересует, хотя бы отладчик где можно смотреть обработчики поставленные таким путем

da_ff 29.09.2011 18:47

Jamshut,
Сам буду рад если кто-то ответит, потому как сам такого инструментария не встречал. Есть решения для различных библиотек, но решения, которое бы расширяло DOM-объекты соответсвующими коллекциями обработчиков не видел.


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