2015-08-13 3 views
1

Я скручиваю свой ум и пальцы, обнаружив, почему removeEventListener не будет работать. Это должно быть одноразовое событие, поэтому я включил removeEventListener в функцию обратного вызова. Но событие срабатывает каждый раз.RemoveEventListener не работает с именованной функцией

var group = ...//some div's ID 
var img_button = document.createElement("SPAN"); 
    img_button.setAttribute("id","imgbutton_"+group); 
if (figures.addEventListener){ 
    figures.addEventListener(
    'click', function(e){if (!e) e = window.event;e.stopPropagation();}, false); 
    img_button.addEventListener(
    'mouseover', loadImg(group), false); 
    }else{...}; 

И с обратным вызовом loadImg:

function loadImg(nodeId){//loading images when needed 
    return function(e){ 
     if (!e) e = window.event; 
[...] 
    //remove eventlistener when executed once 
     var sp = (e.target ? e.target : e.srcElement); 

     if (sp.removeEventListener){ 
      sp.removeEventListener(
      'mouseover', loadImg); 
     } else {...}; 
}; 

Анонимная функция может остаться, но loadImg мне нужно только один раз. Что я забыл?

+2

'loadImg' - это не имя функции слушателя. Вы добавили функцию, которая возвращается из 'loadImg()', и эта функция не имеет имени (вы можете добавить ее, хотя). – Teemu

ответ

1

loadImg не является именем функции слушателя. Вы добавили анонимную функцию, которая возвращается с loadImg().

Чтобы решить эту проблему, вы можете дать имя фактической функции обработчика событий:

return function handler (e){ 
      : 
    this.removeEventListener('mouseover', handler, false); 
      : 
} 

A working demo at jsFiddle.

this в обработчике событий автоматически ссылается на элемент, к которому было привязано событие.

+0

Спасибо, Teemu. Я дал имя анонимной возвращенной функции и tada !! – elchmaen

+0

@elchmaen Ты добрый. Не совсем связано, но похоже, что вы также поддерживаете старые IE (с старой моделью обработки событий). Если вы использовали 'attachEvent/detachEvent' (рекомендуется), вам не нужно проверять существование объекта' event', оно передается автоматически. Кроме того, в старых IE есть несколько [проблем с именованными выражениями функций] (http://kangax.github.io/nfe/#jscript-bugs). Они будут работать, но вызывают некоторые побочные эффекты, просто позаботьтесь, чтобы вы дали уникальное имя своему обработчику. – Teemu

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