位置: IT常识 - 正文

Iframe通信(iframe之间通信)

编辑:rootadmin
Iframe通信

推荐整理分享Iframe通信(iframe之间通信),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:iframe通信url传参数,iframe通信库,iframe通信url传参数,iframe通信同源和不同源,iframe通信如何查看,iframe通信同源和不同源,iframe通信url传参数,iframe通信同源和不同源,内容如对您有帮助,希望把文章链接给更多的朋友!

 跨域的种类

一般有两种形式的跨域问题:

 ①使用XmlHttpRequest(XHR)或者使用AJAX发送的POST或者GET请求。这种形式的跨域是:前端页面与后端进行的跨域请求。

②父子页面之间进行的DOM操作(父子窗口之间的document操作)。这种形式的跨域是:前端页面与前端页面之间的通信或者相互操作的形成跨域。(本文主要讲这种)

iframe通信方式:

同域直接通过iframe的contentWindow 和parent去操作相应的窗口内的window.document....主域不同,设置document.domain就可以如上操作跨域及不跨均可应用:window.name、location.hash、postMessage和onmessage

访问iframe: contentWindow 访问父级:parent 访问顶级:top

1、不跨域:

父:

<body> <textarea id="message">这是高层的密码!</textarea><br/> <button id="test">看看员工在说什么</button><br/><br/><br/> 员工们:<br/> <iframe src="b.htm" width="500" height="300" id="iframe"></iframe> <script> document.getElementById("test").onclick = function(){     alert(document.getElementById("iframe").contentWindow.document.getElementById("message").value);   } </script> </body>

子:

<html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JSONP方式</title><script type="text/javascript" src="/js/jquery-1.5.1.min.js"></script> </head><body> <textarea id="message">这是员工的密码!</textarea><br/> <button id="test">看看领导在说什么</button><br/> <script> document.getElementById("test").onclick = function(){ alert(parent.document.getElementById("message").value); } </script></body></html>

2、主域相同、子域不同

使用document.domain=主域名

document.domain设置规则:

 document.domain只设置域名或者IP地址。即:没有协议(http/https),没有端口。如果访问的地址是域名形式,则document.domain只能设置为当前域名下的同级或者父级域名,并且不能设置为顶级域名,也不可以设置为其他形式的域名(不是当前域名的父级或同级)。

例如:当前访问地址为:https://mp.csdn.net/mp_blog/creation/editor/121540023(当前页面)。可以打开Chrome的控制台(F12)找到console的tab。默认情况下,我们输入document.domain会显示‘csdn.net’。其中csdn.net就是https://mp.csdn.net的父级域名。我们也可以设置为mp.csdn.net。因为mp.csdn.net是mp.csdn.net的同级域名。

但是我们不能设置顶级域名,即document.domain='net',就会提示错误信息。也不能设置其他的域名形式。即document.domain='csdn1.net'或者document.domain='baidu.com'。提示也说得很清楚。必须是mp.csdn.net的一个后缀形式。

如果访问地址是IP的形式,则document.domain只能设置一样的IP地址。

 注意:根据上面的设置规则,在使用document.domain的方式时,页面之间必须有相同的父级域名。否则这种方式将无法进行操作。

a.html (http://a.xxx.com/js/crossdomain/demo/a.htm)

<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>A</title></head><body><textarea id="message">这是高层的密码!</textarea><br/><button id="test">看看员工在说什么</button><br/><br/><br/>员工们:<br/><iframe src="http://b.xxx.com/js/crossdomain/demo/b.htm" width="500" height="300" id="iframe"></iframe><script> document.domain = "jiaju.com"; document.getElementByI d("test").onclick = function(){ alert(document.getElementByI d("iframe").contentWindow.document.getElementByI d("message").value); }</script></body></html>

b.html ((http://b.xxx.com/com/js/crossdomain/demo/b.htm ))

<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>JSONP方式</title><script type="text/javascript" src="/js/jquery-1.5.1.min.js"></script></head><body><textarea id="message">这是员工的密码!</textarea><br/><button id="test">看看领导在说什么</button><br/><script> document.domain = "jiaju.com"; document.getElementByI d("test").onclick = function(){ alert(parent.document.getElementByI d("message").value); }</script></body></html>

 两个域都设置:document.domain=‘jiaju.com’

3、主域不同

1)location.hash

Iframe通信(iframe之间通信)

location.hash原理: 1、动态改变location.hash,iframe不会重载 2、无论跨域与否,iframe内可以获取自己的location.hash 3、只要域名相同就能通信,即使ABC三层嵌套

a.html(http://www.aaa.com/demo/cross/iframe03/a.htm)嵌套了b.html(http://www.bbb.com/demo/cross/iframe03/b.html)

//父页面通过hash像子页面传值var iframe = document.getElementByI d("iframe")修改iframe.src改变其hash//子页面监听hash改变,获取hash上的值:window.location.hash//子页面=》父页面:要知道iframeidvar hash_url = window.location.hash, datas = hash_url.split("#")[1].split("&"), data = {};for(var i = 0;i<datas.length;i++){ var t = datas[i].split("="); data[t[0]] = decodeURIComponent(t[1]);}document.domain = "jiaju.com";switch(data["JJtype"]) { case "height": try{top.window.document.getElementByI d(data["iframeID"]).height = data["height"];}catch(e){} break case "width": try{top.window.document.getElementByI d(data["iframeID"]).width = data["width"];}catch(e){} break case "callback": try{top.window[data["fn"]].call(document,data);}catch(e){} break default: }

location.hash缺点 1、传递数据量有限 2、不太安全

2)window.name

location.hash缺点 1、传递数据量有限 2、不太安全

window.name

window.name 是什么:name 在浏览器环境中是一个全局window对象的属性 当在 iframe 中加载新页面时,name 的属性值依旧保持不变name 属性仅对相同域名的 iframe 可访问window.name 的优势:

数据量更大(2M)更安全可传递多种数据格式

window.name 的劣势:

只适用于隐藏iframe的情形

原理(1) : A创建iFrame B,把要传递的数据放入window.name

打开Chrome的控制台,当前地址为:www.baidu.com。你在console的控制台中输入window.name='moxiao',然后将当前页面的地址栏的地址改为:mai.qq.com,然后在console的控制台中打印window.name将会显示:‘moxiao’。

跨域iframe怎么调用父页面方法

 若父页面: parent.html;嵌在父页面的子iframe页面:child.html

1)同域时 iframe 调用父页面的JS方法

在同域的情况下,子iframe页面可以很方便地直接调用父页面定义的JS方法:window.parent.fn(); 或者 window.top.fn();

window.self: 当前窗口自身的引用window.parent: 上一级父窗口的引用window.top: 最顶层窗口的引用

当页面中不存在 iframe 嵌套时,则 window.self, window.parent, window.top 三者均是当前窗口自身的引用。

2)不同域时 iframe 调用父页面的JS方法

不同域时上面方式调用,不报跨域错误

postMessage 的发送与接收,Window.postMessage 是 HTML5 提供的一个跨域解决方案。

1、发送:otherWindow.postMessage(message, targetOrigin, [transfer]);

otherWindow:其他窗口的一个引用,如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames; message: 将要发送到其他 window的数据;targetOrigin: 通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串”*”(表示无限制)或者一个URI。

2:接收:

//event.data :传递过来的信息,也就是 postMessage 中发出的 message;//event.origin: 发送信息页面的域名,包括协议和端口号。window.addEventListener("message", function(event){ var data = event.data; // 判断域名 if(event.origin == 'http://192.168.1.237'){ //doSomething() }});父页面像子页面通信:ifram的contentWindow.postMessage子页面像父页面通信:window.parent.postMessage或window.top接收的话直接window监听onmessage事件即可

实现:

a.com 域名下的父页面 parent.html 定义了功能函数 sayHi();父页面 parent.html 中嵌套了子 iframe 页面 child.html(在域名b.com域名下) 。在child.html中引起触发、执行父页面定义的 sayHi()方法。在child.html中向父页面请求获取数据 uname 值。

1) child.html代码:

<script type="text/javascript" src="sdk_child.js"></script><script type="text/javascript"> // 1)触发父页面定义的方法 window.SDK.sayHi({msg: 'hi'}); // 2)向父页面请求获取数据 uname var uname = ''; window.SDK.getUname(); setTimeout(function(){ uname = window.SDK.uname; //doSomething(uname); }, 200); // 备注:发送请求后,需要延时接收返回的数据</script>

2) child.html 中引入的js文件 sdk_child.js 代码:

;(function(){ var sdk = window.SDK || {}; sdk.uname = null; //发送 sdk.getUname = function(){ window.top.postMessage({ action: "getUname" }, "*")}; sdk.sayHi = function(info){ window.top.postMessage({ action: "sayHi", info: { msg: info.msg } }, "*")}; //接收 window.addEventListener("message", function(e){ var res = e; var action = res.data.action; var info = res.data.info; //判断域名 if(res.origin == 'a.com'){ switch (action) { case 'getUname' : sdk.uname = info; break; default : return } } }); //写入window window.SDK = sdk;})();

3) parent.html 中引入的js文件 sdk_parent.js代码:

;(function(){ var iframecont = document.getElementById('gameIframe').contentWindow; var sdk ={ getUname: function(){ var info = Tool.pareUrl(location.href); iframecont.postMessage({action: 'getUname', info: 'zhangsan'}, 'b.com'); }, sayHi: function(info){ alert(info.msg); }, }; //监听接收 window.addEventListener("message", function(e){ var res = e; var data = e.data; var info = e.data.info; if(true){ switch (data.action) { case 'sayHi' : sdk.sayHi(info); break; case 'getUname' : sdk.getUname(); break; default : return } } });})();
本文链接地址:https://www.jiuchutong.com/zhishi/299983.html 转载请保留说明!

上一篇:Vue在HTML中如何使用(vue怎么嵌入html)

下一篇:详解Promise使用(promise基本使用)

  • airpodspro换了一只怎么配对(换了airpods pro要重置吗)

    airpodspro换了一只怎么配对(换了airpods pro要重置吗)

  • 自己充的抖音币怎么提现(自己充的抖音币怎么退款)

    自己充的抖音币怎么提现(自己充的抖音币怎么退款)

  • 苹果手机壁纸怎么恢复成原来的(苹果手机壁纸怎么是模糊的)

    苹果手机壁纸怎么恢复成原来的(苹果手机壁纸怎么是模糊的)

  • 悬浮窗已开启但无显示(悬浮窗已开启但没反应)

    悬浮窗已开启但无显示(悬浮窗已开启但没反应)

  • 电脑放久了会不会坏(电脑放久了会不会坏掉)

    电脑放久了会不会坏(电脑放久了会不会坏掉)

  • 手机assetbundle删了会怎样(手机assetbundle能不能删除)

    手机assetbundle删了会怎样(手机assetbundle能不能删除)

  • y7s和y5s的区别(y5s和y7s的外形区别)

    y7s和y5s的区别(y5s和y7s的外形区别)

  • 小米10待机一晚耗多少电(小米10待机一晚上耗电20)

    小米10待机一晚耗多少电(小米10待机一晚上耗电20)

  • 芒果TV怎么没有弹幕显示(芒果tv怎么没有直播栏目)

    芒果TV怎么没有弹幕显示(芒果tv怎么没有直播栏目)

  • 笔记本wlan启用不了怎么办(笔记本wlan启用后又会自动禁用)

    笔记本wlan启用不了怎么办(笔记本wlan启用后又会自动禁用)

  • 手机屏幕划不动但是按键能按怎么办(平果手机屏幕划不动)

    手机屏幕划不动但是按键能按怎么办(平果手机屏幕划不动)

  • 台式电脑没有蓝牙怎么安装(台式电脑没有蓝牙功能怎么连接蓝牙)

    台式电脑没有蓝牙怎么安装(台式电脑没有蓝牙功能怎么连接蓝牙)

  • fx9800p相当于英特尔i几(fx9800相当于英特尔i几)

    fx9800p相当于英特尔i几(fx9800相当于英特尔i几)

  • 欧版苹果和国行有什么区别(欧版苹果和美版区别)

    欧版苹果和国行有什么区别(欧版苹果和美版区别)

  • oracle初始密码(oracle初始化账号密码)

    oracle初始密码(oracle初始化账号密码)

  • ios12测试版能降级吗(ios12测试版下载)

    ios12测试版能降级吗(ios12测试版下载)

  • 定位显示离线什么意思(定位手机显示离线怎么找回)

    定位显示离线什么意思(定位手机显示离线怎么找回)

  • ipad是电脑吗(ipad算不算电脑)

    ipad是电脑吗(ipad算不算电脑)

  • ios13为什么闹钟有时没声音(ios13.3闹钟不响)

    ios13为什么闹钟有时没声音(ios13.3闹钟不响)

  • 快手极速版能发作品吗(快手极速版能发短视频吗)

    快手极速版能发作品吗(快手极速版能发短视频吗)

  • 14寸笔记本分辨率多少合适(14寸笔记本分辨率1920x1080怎么样)

    14寸笔记本分辨率多少合适(14寸笔记本分辨率1920x1080怎么样)

  • 打开蜂窝数据不显示4g(蜂窝数据打开没反应)

    打开蜂窝数据不显示4g(蜂窝数据打开没反应)

  • 平板有手电筒吗(三星平板有手电筒吗)

    平板有手电筒吗(三星平板有手电筒吗)

  • 微信可以单独设置提示音吗(微信可以单独设置消息提示音吗)

    微信可以单独设置提示音吗(微信可以单独设置消息提示音吗)

  • 手机卡欠费了能注销吗(手机卡欠费了能办第二张吗)

    手机卡欠费了能注销吗(手机卡欠费了能办第二张吗)

  • 研发支出属于什么现金流量项目
  • 初中毕业可以考警察学校吗
  • 个税申报人员多怎么申报
  • 企业购买理财都需先交税再提现吗
  • 如何查询公司的财务负责人
  • 母公司帮子公司偿还债务
  • 其他应收款要做账吗
  • 发放代扣代缴个人所得税分录
  • 税务记账保存多少年纳税人转小规模
  • 收到低值资产报废回收款账务处理
  • 用现金暂付职工差旅费3000元
  • 公益性捐赠可以结转几个年度
  • 写字楼出租可以给租户注册吗
  • 核销的方式
  • 代扣代缴个人所得税计入哪个科目
  • 企业职工福利费扣除标准
  • 增值税税率零税率
  • 培训发票可以抵进项税吗
  • 含税和不含税哪个对卖方有利
  • 增值税发票免税和0%区别
  • 金税盘费用如何抵扣
  • 企业向职工发放的奖金属于
  • 外币折算买入价卖出价
  • 利润表净利润等于科目余额表
  • 共同投资项目工程款怎么开票?
  • 过路费可以抵税吗
  • 个人使用过的设备有哪些
  • safedownloader是什么
  • 服务佣金是什么意思
  • 发票登记薄的样式是什么
  • 租赁合同维修义务谁承担
  • 什么情况下公司可以开除员工
  • Mac笔记本电脑截图
  • Linux系统中怎么开机自动运行拍摄文件
  • 转账收到支付宝电话
  • 小规模纳税人销售商品会计分录
  • vue编写网页
  • php添加扩展
  • 小规模纳税人避税
  • 矿产资源补偿费与采矿权价款区别
  • mavon-editor的使用
  • 资产处置损益计算公式
  • 贷款和应收款项属于金融资产的哪类
  • 深入讲解党的创新理论
  • 收到赔偿金怎么写收据?
  • 实收资本认缴怎么做账,要做账吗
  • 冲销以前年度费用会计分录
  • 资产负债表日后事项是指资产负债表日之后至审计报告
  • sql server 使用
  • 以货换货什么意思
  • 培训学校的主营业务是什么
  • 印花税城建税教育费附加等其他税种的纳税申报
  • 收到法院退回的诉讼费怎么做账
  • 减值损失账务处理
  • 福利设施的定义
  • 没有开票的收入要交增值税吗
  • 违反会计规定承担责任
  • win10怎么用ghost
  • ubuntu /opt
  • window10怎样格式化u盘
  • keyemain.exe是什么
  • win7任务栏突然变成灰色
  • 关闭迅雷安卓版自动更新
  • unity的粒子系统在哪
  • 图片加载完成再加载
  • JS写XSS cookie stealer来窃取密码的步骤详解
  • 实现高性能化 两个字表达
  • Android开发如何找到TextView指定文本
  • 音乐播放音乐
  • js如何引用
  • js设计模式书
  • vuejs组件开发实例
  • js数组拼接字符串
  • linux中xargs用法
  • 详解使用Visual Studio Code对Node.js进行断点调试
  • JavaScript Math.round() 方法
  • 浦发银行企业银行电话
  • 土地增值税核定征收尾盘销售
  • 税务全面从严治党工作会议讲话稿
  • 体育局和什么局合并了
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设