Как удалить событие ~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)но ничего не выходит. Где я ошибся? |
Вторым параметром нужно передать ссылку на функцию, которую нужно удалить.
|
Попробовал, но так не получается повесить замыкание:
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) |
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) |
А еще, рекомендую использовать оператор var. Тем более в циклах. А то произойдет вот такая фигня:
function someFunc(){ for(i = 0; i < 10; i++){}; }; for(i = 0; i < 10; i++) { // Думаешь будет 10 алертов??? Как бы не так!) alert(i); someFunc(); }; |
ок, учту... спасибо за помощь
|
Всетаки решил проблему. Сперва погуглил, нашел несколько аналогичных тем на других форумах, и там был подмечен ключевой факт - при использовании замыканий создается анонимная функция, так что надо искать решения без них. Поэтому я немного переделал свой скрипт, теперь все работает:
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) |
Какие-то странные выводы, и как результат - странный код.:)
Цитата:
var func = (function(){ return function withName(){}; }()); alert( func.name );Замык� �ние - есть, и функция - не анонимная. И что? |
Diego,
Если вы используите jQuery тогда для удаления есть unbind() |
Diego,
Если вы используите jQuery тогда для удаления есть unbind |
Часовой пояс GMT +3, время: 07:13. |