12

请检查以下代码:

var clickfn = function(){
 alert("clicked");                    
}
document.getElementById("div1").addEventListener("click",clickfn,true);
clickfn = function(){  };
document.getElementById("div1").removeEventListener("click");

http://jsfiddle.net/qUtzL/4/

为什么不起作用removeEventListener

4

3 回答 3

11

removeEventListener接受 2 个参数、事件和要删除的函数。
这应该有效:

document.getElementById("div1").removeEventListener("click", clickfn);

此外,您正在执行的功能是空的。

var clickfn = function(){  };
于 2012-11-20T13:34:51.560 回答
7

您必须指定您指定的确切函数addEventListener作为第二个参数。如果您指定了第三个useCapture参数,则您还必须指定相同和等价的参数removeEventListener

例如:

function myFunc(event){ alert(event.target.textContent); }

var myElement=document.getElementById('myElement');

//Add EventListener
myElement.addEventListener('click', myFunc, false );

/* ... */

//Remove EventListener
myElement.removeEventListener('click', myFunc, false );

在 jsFiddle 查看示例

您可以在Mozilla Developer wiki找到更多信息。

于 2012-11-20T13:35:48.577 回答
2

我最近在 ReactJS 中的 Navbar 代码中遇到了这个问题,在 y 轴上滚动 100px 后为 Navbar 提供背景颜色,如果页面视图在顶部 100px 范围内,则将其删除。

我所要做的就是在 removeEventListener 中引入一个反向函数,为它提供应用程序规则。

const [show, handleShow] = useState(false);
  useEffect(() => {
    window.addEventListener('scroll', () => {
      if (window.scrollY > 100) {
        // do this
        handleShow(true);
      } else handleShow(false);
    });
    return () => {
      window.removeEventListener('scroll', () => {
        if (window.scrollY < 100) {
          // do this
          handleShow(false);
        } else handleShow(true);
      });
    };
  });
于 2020-10-12T14:36:24.507 回答