首页 > 网络编程 > JavaScript > javascript技巧 > removeEventListener取消事件监听

关于js中removeEventListener取消事件监听的坑

作者:huangfengnt

许多入前端不久的人都会遇到removeEventListener无法清除监听的情况,下面这篇文章主要给大家介绍了关于js中removeEventListener取消事件监听的坑,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

从addEventListener说起,上代码

onMounted(() => {
    window.addEventListener("click", ()=>{
        doSth(param)//param为参数

addEventListener有一个箭头函数回调函数,这个函数本身不能传参(当然event除外),如果你要传参,只能在doSth函数上传,我们也可以将箭头函数回调函数替换成一个函数,但是这个函数明显不能有参数

onMounted(() => {
    window.addEventListener("click", doSth)//这个doSth就没有参数了

非要让doSth有参数,可以在函数外面包上一层函数

let doSth1=()=>{
    doSth(param)
onMounted(() => {
    window.addEventListener("click", doSth1)//这个doSth1就是外面包装的函数

以上的原理都适用于removeEventListener,但是emoveEventListener还有一个注意点,见下

onMounted(() => {
    window.addEventListener("click", () => {
        doSth()
onUnmounted(() => {
    window.removeEventListener("click", () => {
        doSth()

以上这样的代码是通不过的,因为removeEventListener的第二个参数,也就是那个回调函数必须和addEventListener的回调函数是同一个函数,共享内存,下面这种写法就行得通

onMounted(() => {
    window.addEventListener("click", doSth)
onUnmounted(() => {
    window.removeEventListener("click",doSth)

然而,上面这种写法还是不能传参,所以要传参的话还是要外包一个函数,如下

let doSth = (str: string) => {
    console.log(str);
let doSth1 = () => {
    doSth("haha")
onMounted(() => {
    window.addEventListener("click", doSth1)
onUnmounted(() => {
    window.removeEventListener("click", doSth1)

然而,如果你用ts的话,doSth函数的参数可以是一个可选参数,如下

let doSth = (str?: string) => {
    if (typeof str == "string") {
        console.log("传参了");
    } else {
        console.log("没传参");
onMounted(() => {
    window.addEventListener("click", doSth)
onUnmounted(() => {
    window.removeEventListener("click", doSth)

这样的情况则会提示一则消息:

没有与此调用匹配的重载。

  第 1 个重载(共 2 个),“(type: "click", listener: (this: Window, ev: MouseEvent) => any, options?: boolean | AddEventListenerOptions | undefined): void”,出现以下错误。

  第 2 个重载(共 2 个),“(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void”,出现以下错误。

当然这样实际运行是可以的,没什么问题,但是报错很难看,解决这个问题又不想在外面包上一层函数,那么可以直接给doSth加上any类型

let doSth: any = (str: string) => {
    if (typeof str == "string") {
        console.log("传参了");
    } else {
        console.log("没传参");
onMounted(() => {
    window.addEventListener("click", doSth)
onUnmounted(() => {
    window.removeEventListener("click", doSth)

 当然其中原因还是没能搞懂,唉,慢慢来吧

到此这篇关于js中removeEventListener取消事件监听的文章就介绍到这了,更多相关removeEventListener取消事件监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • uniapp中微信小程序与H5相互跳转以及传参详解(webview)
    uniapp中微信小程序与H5相互跳转以及传参详解(webview)
    2022-08-08
  • 微信小程序嵌入H5页面(web-view)的方法详解
    微信小程序嵌入H5页面(web-view)的方法详解
    2022-09-09
  • uni-app实现微信小程序长按拍视频功能
    uni-app实现微信小程序长按拍视频功能
    2022-08-08
  • js数组去重常见的方法汇总(7种)
    js数组去重常见的方法汇总(7种)
    2022-08-08
  • 关于js中removeEventListener取消事件监听的坑
    关于js中removeEventListener取消事件监听的坑
    2022-08-08
  • 一文带你了解async/await的使用
    一文带你了解async/await的使用
    2022-08-08
  • 原生JS面向对象实现打砖块小游戏
    原生JS面向对象实现打砖块小游戏
    2022-08-08
  • JS+cookie实现购物评价五星好评功能
    JS+cookie实现购物评价五星好评功能
    2022-08-08
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号