2011-01-06 5 views
6

Можно создать дубликат:
Removing an anonymous event listenerJavascript: удаление анонимного прослушивателю событий

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

_SU3.addEventListener = function(elem, eventName, fn) { 
if(elem.addEventListener) { 
    elem.addEventListener(eventName, fn, false); 
    } else if (elem.attachEvent) { 
     elem.attachEvent('on'+eventName, fn); 
    } 
}; 

Я m добавление слушателя следующим образом:

_SU3.addEventListener(_show, "click", function(event) { 
          _SU3.getChildren(_show, uri, element); 
        }); 

Все в порядке. Однако я хочу удалить слушателя после того, как он был вызван один раз. I.e что-то вроде:

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', ANON_FUNCTION); 

}; 

Но, конечно, функция прослушивателя анонимна, поэтому нет ссылки на функцию для ссылки.

Как удалить слушателя?

Thanks

+0

Вы должны где-то хранить ссылку. Либо явным образом передавая ссылку на вашу функцию, либо неявно внутри вашей функции. –

ответ

8

Вам необходимо сохранить ссылку на функцию:

var foo = function(event) { _SU3.getChildren(_show, uri, element); }; 

_SU3.addEventListener(_show, "click", foo); 

...

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', foo); 

}; 

Убедитесь, что переменная foo находится в области видимости, где вы удалите прослушиватель событий.

+0

Спасибо. Но этот слушатель добавляется ко многим элементам страницы, поэтому я не могу иметь глобальную переменную, так как это будет перезаписано, если слушатель вызывается для других элементов. –

+0

@ Рихард: Я не сказал, что это должно быть глобальным, я сказал, что это должно быть в сфере. – Matt

4

Вы не можете. Если вы хотите удалить его, вы должны сохранить ссылку на него. Как еще вы могли бы отличить его от других?

+1

Ну, я с удовольствием очистил всех кликов, прикрепленных к элементу, если это возможно? –

+2

Нет, такой функции нет. –

3

Вместо удаления слушателя событий, организовать для того, чтобы следить за это ли он называется:

addOneShotListener = function(elem, eventName, fn) { 
    var triggered = false, handler = function(ev) { 
    if (triggered) return; 
    fn(ev); 
    triggered = true; 
    }; 

    if(elem.addEventListener) { 
    elem.addEventListener(eventName, handler, false); 
    } else if (elem.attachEvent) { 
    elem.attachEvent('on'+eventName, handler); 
    } 
}; 

Это вариация на оригинальную функцию только оборачивает оригинальный обработчик (далее «Fn», переданный в) с функцией, которая только вызывает обработчик при первом вызове. После этого он устанавливает флаг и больше не будет вызывать функцию исходного обработчика.

+0

Это интересное предложение, спасибо –

0

Если у вас есть только одно событие щелчка, назначенное в любой момент времени для элемента, почему бы не установить свойство onclick? Вы можете удалить его в любое время с помощью element.onclick = '';

+0

Поскольку страница динамически построена, и я обнаружил, что выполнение node.setAttribute ('onclick', 'function') не работает в некоторых браузерах. –

+0

Он сказал свойство, а не атрибут. – Neil

+0

object.onclick = function (e) {// etc}; –

Смежные вопросы