当前位置: 首页 > Web前端 > HTML5

前端--iframe爬取记录

时间:2023-04-05 15:14:08 HTML5

1.iframe通信由于项目使用vue嵌入静态页面实现功能,所以vue页面与普通H5页面的通信存在问题。这篇文章写的很详细https://segmentfault.com/a/11...但是在开发过程中遇到了一些问题,比如:iframe发送跳转消息--->vue页面处理消息,根据tomessage跳转到对应页面--->点击对应页面跳转到原vue页面。第二次重复上述过程时,iframe发送的消息给vue页面的监听器会有两次响应,和发送出去的两次消息分别是前几次和这次,并且会有在随后的重复跳跃过程中得到重复反应。一开始怀疑是window缓存了消息,因为刷新页面后,之前的响应消息会消失,但是找了很多也没有办法清除windowcache。并且这些消息没有缓存在localstorage中。然后仔细发现,当打开第二个vue页面的时候,第一个vue页面被销毁了,当我再次回到第一个页面的时候,页面居然重新加载了。我想这是由于vue基于组件构建页面的原理,所以再次构建组件时,会再次将监听器添加到窗口中。反正解决方法如下:既然会重复添加,那就在vue组件销毁的时候把windowlistener删掉。//在组件生命周期结束时销毁beforeDestroy(){if(window.addEventListener){window.removeEventListener('message',this.handleMessage)}else{window.detachEvent('message',this.handleMessage)}}下面是添加监听的代码.iframe加载消息到iframe页面时,偶尔会出现iframe无法发送的情况。查阅了很多资料,才发现这又是一个坑。https://blog.csdn.net/baidu_3...没有加载iframe的时候,消息自然不会发送到iframe。但是既然发不出去,应该是报异常什么的,不过就是悄无声息的发生了,后面再说原理。解决方法是将postMessage事件写入iframe的load事件中,代码如下:getDataAndPost(){请求数据()。然后(res=>{this.$refs.iframe.contentWindow.postMessage(res,'*')}).catch(function(err){console.log(err)})}