Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.03.2011, 13:20
Интересующийся
Отправить личное сообщение для Diego Посмотреть профиль Найти все сообщения от Diego
 
Регистрация: 06.02.2011
Сообщений: 24

Как удалить событие ~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)
но ничего не выходит. Где я ошибся?
Ответить с цитированием
  #2 (permalink)  
Старый 26.03.2011, 13:29
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Вторым параметром нужно передать ссылку на функцию, которую нужно удалить.
Ответить с цитированием
  #3 (permalink)  
Старый 26.03.2011, 14:06
Интересующийся
Отправить личное сообщение для Diego Посмотреть профиль Найти все сообщения от Diego
 
Регистрация: 06.02.2011
Сообщений: 24

Попробовал, но так не получается повесить замыкание:
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)
Ответить с цитированием
  #4 (permalink)  
Старый 26.03.2011, 14:22
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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)
Ответить с цитированием
  #5 (permalink)  
Старый 26.03.2011, 14:33
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

for(i = 0; i < 10; i++) {
  // Думаешь будет 10 алертов??? Как бы не так!)
  alert(i);
  someFunc();
};
Ответить с цитированием
  #6 (permalink)  
Старый 26.03.2011, 14:35
Интересующийся
Отправить личное сообщение для Diego Посмотреть профиль Найти все сообщения от Diego
 
Регистрация: 06.02.2011
Сообщений: 24

ок, учту... спасибо за помощь
Ответить с цитированием
  #7 (permalink)  
Старый 26.03.2011, 16:36
Интересующийся
Отправить личное сообщение для Diego Посмотреть профиль Найти все сообщения от Diego
 
Регистрация: 06.02.2011
Сообщений: 24

Всетаки решил проблему. Сперва погуглил, нашел несколько аналогичных тем на других форумах, и там был подмечен ключевой факт - при использовании замыканий создается анонимная функция, так что надо искать решения без них. Поэтому я немного переделал свой скрипт, теперь все работает:
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)
Ответить с цитированием
  #8 (permalink)  
Старый 26.03.2011, 17:15
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

alert( func.name );
Замык ние - есть, и функция - не анонимная. И что?
Ответить с цитированием
  #9 (permalink)  
Старый 26.03.2011, 17:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

Diego,
Если вы используите jQuery тогда для удаления есть unbind()
Ответить с цитированием
  #10 (permalink)  
Старый 26.03.2011, 17:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить из строки ненужные символы? PAMAC Серверные языки и технологии 4 23.02.2011 17:45
Как можно удалить динамически созданный элемент Арсений Элементы интерфейса 18 08.07.2010 12:56
Как удалить элемент из документа HTML Dima00782 Общие вопросы Javascript 2 28.06.2010 17:32
можно ли, если да то как удалить строки из таблицы Avaria Я не знаю javascript 3 11.06.2009 03:03
Как удалить html тег по id? romosyto Я не знаю javascript 5 10.06.2009 18:54