zoukankan      html  css  js  c++  java
  • 使用iframe+postMessage跨域操作和通信

    使用iframe+postMessage跨域操作和通信

    场景

    1. http://XXX/a.html(自己的)页面要操作http://YYY/b.html(其他域名的)
    2. 看了网上很多都是同域名下的,同域名下我自己就改了,还用的上iframe+postMessage?开玩笑
    

    分析

    直接操作肯定是没戏,同源策略给你限制的死死的。所以要采用iframe+postMessage
    

    实现

    1.后端将b页面转出字符串,生产接口给前端调用(其实还是为了可以操作b页面)

    这里需要用到后端,后端拿到b页面,将b页面生存字符串,然后还需要将页面所引用相对路径替换成绝对路径,不如页面展示之后都是报错,无法往下执行.比如页面引入了一个图片 <img src='./a.png' />,需要替换成<img src='http://YYY/a.png' /> js ,css同理
    

    2.在a页面的域名下创建一个新页面c.html,用来展示b页面转换而成的字符串,c页面操作如下

    <div id='patch'></div>
    	var patchNode = document.getElementById('patch')
    	var objE = document.createElement("div")
     	objE.innerHTML = '请求下来的字符串'
      	patchNode.appendChild(objE)
    

    3.a页面采用iframe加载c页面

    <iframe id="iframe_child" src="./c.html"></iframe>
    
    

    4.a,c页面采用postMessage通信

    a页面操作如下 发生内容给iframe
    	$(`#iframe_child`).on('load', function(){ // 和iframe通信
    		var data = {
    			act: 'article',  // 自定义的消息类型。
    			msg: {
    				subject: '111'
    			}
    		};
    		// 不限制域名则填写 * 星号
    		$(`#iframe_child`).contentWindow.postMessage(data, '*')
    	});
    	// 对来自 c.html 的消息进行处理
    	window.addEventListener('message', function(e){
    		if (e.data.act == 'response') {
    			console.log(`进行接收之后的操作---${e.data.msg.answer}`)
    		}
    	}, false)
    	
    	c页面操作如下
    	
    	window.addEventListener('message', function(e){
    	    if (e.data.act == 'article') {
    	      var article = e.data.msg
    	      console.log(`接收的信息为`${article.subject})
    	      window.parent.postMessage({ // 传递给父页面单次操作完毕
    	        act: 'response', 
    	        msg: {
    	          answer: '我收到信息了'
    	        }
    	      }, '*');
    	
    	    } else {
            console.log('未定义的消息: '+ e.data.act)
          }
      }, false);
      在c页面直接操作b页面的字符串生成的dom,间接实现a操作b页面
      
    

    5.总结

    1.为什么不直接在a页面展示字符串,还要嵌套一个iframe?

  • a页面安全
  • 如果b页面有跳转,报错等问题也影响不到a页面(主要是我做的时候发现这两个页面引用了同一个js,因为js引用顺序问题导致b页面报错,所以才引入的iframe′⌒`)
    2.为啥要把b页面转出字符串
  • 为了能操作的无奈之举,这么操作是为了将跨域的页面b转成同域名页面c,在c操作b的dom
查看全文
  • 相关阅读:
    书本第十三章课后习题4、5、6
    软件工程一班第五小组知识树系统-软件测试计划
    第八周作业
    第七周作业——用面向对象方法分析研究书中习题2第3题中描述的机票预订系统,试建立它的对象模型、动态模型和功能模型。
    第六周作业——建立订货系统的用例模型
    第五周作业——用状态转换图描绘复印机的行为
    第四周作业——在你的实际项目旅游网站中,网页主页面主要有哪些模块?
    第三周作业—— 在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?
    第二周作业——面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?请根据自己的理解简明扼要的回答。
    有学生提到,在大学选课的时候,可以写一个“刷课机”的程序,利用学校选课系统的弱点或漏洞,帮助某些人选到某些课程。或者帮助用户刷购票网站,先买到火车票。这些软件合法么?符合道德规范么?是在“软件工程”的研究范围么? 请大家讨论。
  • 原文地址:https://www.cnblogs.com/liuhuanwen/p/11341148.html
  • Copyright © 2011-2022 走看看