Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как удалить событие ~EventListener (https://javascript.ru/forum/misc/16105-kak-udalit-sobytie-%7Eeventlistener.html)

Diego 26.03.2011 13:20

Как удалить событие ~EventListener
 
Читал в учебнике на этом сайте, но так и не понял как правильно удалять событие в нормальных браузерах. Допустим, у меня такой код есть:
element.addEventListener( "click" , function(x) {return function() {$('#div'+x).slideToggle('fast')}}(i), false)
этот код в цикле был, поэтому стоит замыкние
пробовал удалять так:
element.removeEventListener( "click" , function(x) {return function() {$('#div'+x).slideToggle('fast')}}(i), false)
но ничего не выходит. Где я ошибся?

Sweet 26.03.2011 13:29

Вторым параметром нужно передать ссылку на функцию, которую нужно удалить.

Diego 26.03.2011 14:06

Попробовал, но так не получается повесить замыкание:
function slide(x) {return function() {$('#div'+x).slideToggle('fast')}}

for(i=0;i<ninv.length;i++){    
 ninv[i].addEventListener( "click" , slide(i), false)
}

//так работает, но удаление события все равно не срабатывает

element.removeEventListener( "click" , slide, false)

Sweet 26.03.2011 14:22

slide и slide(i) - разные функции. Нужно как-то так:
function slide(x) {return function() {$('#div'+x).slideToggle('fast')}}

var storage = [];

for(i=0;i<ninv.length;i++){
 storage[i] = slide(i);
 ninv[i].addEventListener( "click" , storage[i] , false)
}

element.removeEventListener( "click" , storage[0], false)

Sweet 26.03.2011 14:33

А еще, рекомендую использовать оператор var. Тем более в циклах. А то произойдет вот такая фигня:
function someFunc(){
  for(i = 0; i < 10; i++){};
};

for(i = 0; i < 10; i++) {
  // Думаешь будет 10 алертов??? Как бы не так!)
  alert(i);
  someFunc();
};

Diego 26.03.2011 14:35

ок, учту... спасибо за помощь

Diego 26.03.2011 16:36

Всетаки решил проблему. Сперва погуглил, нашел несколько аналогичных тем на других форумах, и там был подмечен ключевой факт - при использовании замыканий создается анонимная функция, так что надо искать решения без них. Поэтому я немного переделал свой скрипт, теперь все работает:
function slide() {return function() {$('#div'+this.num).slideToggle('fast')}}

for(i=0;i<ninv.length;i++){
ninv[i].num = i 
//фиксируем номер ячейки массива на ее свойстве, а потом считываем это свойство, как будто находимся в цикле(в функции сверху)
 ninv[i].addEventListener( "click" , slide, false)
}


element.removeEventListener( "click" , slide, false)

Sweet 26.03.2011 17:15

Какие-то странные выводы, и как результат - странный код.:)
Цитата:

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

Это утверждение - бред. И имеет смысл только как показатель отсутствия понимания тобой основ javascript. Пожалуйста:
var func = (function(){
  return function withName(){};
}());

alert( func.name );
Замык� �ние - есть, и функция - не анонимная. И что?

рони 26.03.2011 17:22

Diego,
Если вы используите jQuery тогда для удаления есть unbind()

рони 26.03.2011 17:23

Diego,
Если вы используите jQuery тогда для удаления есть unbind


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