关于window.addEventListener的小坑

这篇具有很好参考价值的文章主要介绍了关于window.addEventListener的小坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

子窗口向父窗口传值,比如点击按钮弹窗打开iframe ,这时候可以使用,防止跨域。我的问题比较简单,就是监听没有删除,导致多次执行

代码

演示代码,不分父子窗口,直接写一个页面内,仅供参考

父窗口,监听数据

window.addEventListener("message", function(e){
	console.log(e.data.msg)
})

子窗口,发送数据

window.postMessage({msg:"Hello World"}, '*');

这个时候,由于我的监听,是放在按钮事件内,所以每点一次就会addEventListener一次,多次点击,就会多次执行,如果里面也有业务逻辑的话,比如发送请求,就会执行多次,所以是BUG。

解决

方案1:在打印后,清除监听。比较恶心的事情发生了(自己体会),结论是:removeEventListener的回调函数和addEventListener的回调函数,必须是同一个。
说人话:必须把函数单独提取出来,然后让他俩调用同一个,如下:

// 监听
window.addEventListener("message", say)

// 提取函数
function say(e){
	console.log(e.data.msg)
	// 移出监听
	window.removeEventListener('message', say);
}

方法二:类似防抖节流的思想,每次点击将函数监听函数进行替换,只执行点击的最后一次,我觉得还是这种方式最简单文章来源地址https://www.toymoban.com/news/detail-760483.html

window.onmessage = function say(e){
	console.log(e.data.msg)
}

到了这里,关于关于window.addEventListener的小坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • addEventListener()参数及事件汇总

            addEventListener() 方法用于给元素添加监听事件,同一个元素可以重复添加,并且不会覆盖之前相同事件,用removeEventListener() 方法来移除事件。 使用方法: 传递参数(包含三个参数): 1.事件名称(String类型) 例如点击事件click,鼠标按下mousedown(和元素绑定事件

    2024年02月07日
    浏览(55)
  • addEventListener和removeEventListener的用法

    addEventListener()用于给指定元素添加事件,可重复添加 removeEventListener()用于移除添加事件 用法 addEventListener()里有三个参数 一.事件名称(必填) 1.click 单击鼠标左键触发 2.dblclick 双击鼠标左键触发 3.mousedown 单击任意一个鼠标按钮时触发 4.mouseup 松开任意一个鼠标按钮时触发

    2024年02月07日
    浏览(28)
  • 为什么在js中需要添加addEventListener()?

    addEventListener(监听器)--- EventTarget.addEventListener() 方法将指定的监听器注册到 EventTarget 上,当该对象触发指定的事件时,指定的回调函数就会被执行。事件目标可以是一个文档上的元素 Element、Document 和 Window,也可以是任何支持事件的对象(比如 XMLHttpRequest)。 addEventListener(

    2024年02月19日
    浏览(38)
  • addEventListener is not a function , JavaScript添加监听事件时报错

    简介:在写JavaScript代码的时候,控制台有时候会遇到这样的报错, addEventListener is not a function ,说addEventListener不是一个函数,具体原因是因为监听事件的事件源不对,事件源应该是一个元素,而非其它。 因此我们在获取元素时要注意, getElementsByClassName()、 getElementByTagName

    2024年02月09日
    浏览(51)
  • vue中动态添加class修改div宽高无法触发addEventListener(“resize“)

    在触发事件动态修改class发现resize没有触发。 具体原因没有找到--------无语 因为不知道什么原因只能替代了,网上说resize消耗很大, MutationObserver与ResizeObserver 更节省性能。

    2024年02月12日
    浏览(44)
  • react hooks 中使用 addEventListener 监听事件无法访问到最新的 state 的问题

    如上述代码所示,props.asyncData 变化之后 hasAsyncData 设置为 true,然后滚动页面,handleMove 中的 hasAsyncData 仍然为初始值 false。 所以这时要在 hasAsyncData 变化后 ,重新绑定 addEventListener 事件 useEffect(() = {   }, [hasAsyncData]) 在useEffect中将他监听起来,从新绑定

    2024年01月21日
    浏览(45)
  • 漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案

    漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案 漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关 漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标 漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的

    2024年01月19日
    浏览(68)
  • 微信小程序引用echart报错 ,上传代码报t.addEventListener is not a function

    最近做项目用到echart新版本,5.4.0。在微信开发工具里面可以正常运行。代码上传的时候就会报错,真机和预览也报错。 解决办法 在ec-canvas文件夹下的 wx-canvas.js文件中添加 addEventListener() {} 空函数,如下: 再上传就不会出错了

    2024年02月11日
    浏览(43)
  • 解决Element UI 多次弹出message消息提示的问题

    使用element ui 的提示信息,可能会出现以下场景,多次的提示信息,影响使用感受。  解决方法: 1、重写 resetMessage.js,具体如下: 在src/utils(文件所在路径可以根据自身需要创建)下新建一个文件 resetMessage.js 2、main.js中引入重写的 resetMessage.js import { message } from \\\'@/utils/re

    2024年02月16日
    浏览(38)
  • element-ui,使用message防止多次提示,全局配置可关闭提示

    情景:在我们使用message的时候每次操作成功,或者进行一些数据交互的时候会进行message提示,但是假如出现我们操作完成要异步继续进行其他操作,或者多次调用接口时这个时候一直提示对用户是很不友好的,我们只需要让他提示最后一次即可; 1:在untils文件夹下创建  o

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包