如何删除没有外部函数的事件监听器

时间:2018-02-24 21:19:31

标签: javascript html web

陷入了真正的困境。我有一个init函数,其中有许多参数相互依赖,不能在外部删除,一个元素数组并添加到每个click事件监听器。此事件侦听器检查单击的元素是否是某个元素,然后从数组中的所有元素中删除单击侦听器。由于init函数的内部参数,我必须在事件监听器中使用anonimus函数,但是为了删除事件监听器,我必须在removeEventListener中传递相同的函数,因此它必须被命名为function而我无法获取解决方案。

近似逻辑:

let init = () =>{

  //some internal parameters here and logic

  for (let i = 0; i < elArr.length; i++) {

    elArr[i].addEventListener('click', event => {
        if (event.target.style.background ===
            elArr[pickedElement].style.background) {

            //Not working (can't define the param as a separate function due 
            //to params of this function can't be passed to there)
            for (let i = 0; i < elArr.length; i++)
                elArr[i].removeEventListener("click", event);

        } else {
            event.target.style.background = bgColor;
        }
    });  
}

2 个答案:

答案 0 :(得分:2)

除非我遗漏了某些内容,否则看起来你可以在init函数的中声明命名函数,因此它仍然可以访问所有内部变量等。

let init = () => {
  //some internal parameters here and logic

  let bgCheckListener = event => {
    if (
      event.target.style.background ===
      elArr[pickedElement].style.background
    ) {
      elArr.forEach(el => {
        el.removeEventListener("click", bgCheckListener)
      })
    } else {
      event.target.style.background = bgColor
    }
  }

  elArr.forEach(el => {
    el.addEventListener("click", bgCheckListener)
  })
}

答案 1 :(得分:1)

[Removed original answer as jquery is not applicable]

您可以简单地替换事件

而不是删除事件侦听器而不是使用

替换元素上的事件侦听器
elArr[i].onClick = function() { };