【问题标题】:How to delete event listener without external function如何在没有外部函数的情况下删除事件监听器
【发布时间】:2018-08-04 16:23:41
【问题描述】:

真正的困境。我有一个 init 函数,它里面有很多参数,这些参数相互依赖,不能在外面删除,一个元素数组并添加到每个元素的单击事件侦听器中。此事件侦听器检查单击的元素是否是某个元素,然后从数组中的所有元素中删除单击侦听器。问题是由于 init 函数的内部参数,我必须在事件侦听器中使用 anonimus 函数,但是要删除事件侦听器,我必须在 removeEventListener 中传递相同的函数,因此它必须命名为函数并且我无法获得解决方案。

大概的逻辑:

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;
        }
    });  
}

【问题讨论】:

    标签: javascript html web


    【解决方案1】:

    除非我遗漏了什么,看起来您可以在 init 函数的inside 中声明命名函数,因此它仍然可以访问所有内部变量等。

    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)
      })
    }
    

    【讨论】:

    • 你是个天才!想成为你的徒弟!在另一个函数中声明一个函数是一种好习惯吗?
    • 应该没问题。一流的函数在 JS 中是一种奢侈,所以滥用它们吧 ;)
    【解决方案2】:

    [Removed original answer as jquery is not applicable]

    你可以简单地替换事件

    使用

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

    【讨论】:

    • 我需要使用 vanila js
    • @fxvlad 我已经更新了我的答案,抱歉我错过了!
    • 不适合我,我猜它只有在你这样分配时才有效。我也认为它是 onclick
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多