关于window.addEventListener的小坑
时间:2024-04-07 20:00:31 来源:网络cs 作者:晨起 栏目:卖家故事 阅读:
阅读本书更多章节>>>>
场景
子窗口向父窗口传值,比如点击按钮弹窗打开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);}
方法二:类似防抖节流的思想,每次点击将函数监听函数进行替换,只执行点击的最后一次,我觉得还是这种方式最简单
window.onmessage = function say(e){console.log(e.data.msg)}
阅读本书更多章节>>>>
本文链接:https://www.kjpai.cn/gushi/2024-04-07/155288.html,文章来源:网络cs,作者:晨起,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。