iframe及与页面之间的通信
获取iframe对象
iframe元素本身是位于父级页面中的,所以你可以像一个普通元素一样的使用和操作它
代表了iframe内容window对象是作为一个页面的属性加入到iframe中的, 为了让父级页面能够以一种合适的方式获取iframe的window对象,父级页面和iframe页面的域名应该保持一致
iframe元素拥有名为contentDocument、parentWindow、contentWindow(全兼容)等属性, 如:
iframeElement.contentWindow || iframeElement.contentDocument.parentWindow
父级页面的window对象在iframe中也能够以window.parent获取
判断 iframe 是否加载完毕的方法(也适用于script加载)
js.onload = js.onreadystatechange = function() {
if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
// callback在此处执行
js.onload = js.onreadystatechange = null;
...
}
};
//为了兼顾事件的一致性,改代码如下:
var iframe = document.createElement("iframe");
iframe.src = "simpleinner.htm";
if (iframe.attachEvent){
iframe.attachEvent("onload", function(){
iframeOnload();
});
} else {
iframe.onload = function(){
iframeOnload();
};
}
document.body.appendChild(iframe);
function iframeOnload() {
alert("Local iframe is now loaded.");
}
iframe 解决跨域问题
什么是跨域
JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象
因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象, 导致了跨域问题
域仅仅是通过”URL的首部”来识别, “URL的首部”指window.location.protocol+window.location.host,也可以理解为”Domains, protocols and ports must match”
方法一: document.domain + iframe
解决主域相同而二级域名不同的情况, 达到两个页面相互通信的目的.
方法二: iframe + location.hash
解决不同域名下的两个页面的通信问题.
由于改变hash并不会导致页面刷新,如:http://a.com#helloword 中的’#helloworld’就是location.hash, 所以可以利用hash来在url中传值
不在同一个域下的两个页面,IE、Chrome不允许修改parent.location.hash的值(Firefox可以修改), 所以需要借助一个iframe作为代理, 修改iframe上url的hash值来达到传递数据的目的, 此时在父级页面上加一个定时器,隔一段时间来获取location.hash值,如果有变化或符合处理的要求, 及关掉间隔执行,如:
先是a.com下的文件cs1.html文件: page1:父页面
function checkHash() {
var data = location.hash ? location.hash.substring(1) : '';
if (data) {
console.log(data);
//do something...
}
}
setInterval(checkHash, 2000); page2: 子页面
try {
parent.location.hash = 'somedata';
} catch (e) {
// ie、chrome的安全机制无法修改parent.location.hash,
// 所以要利用一个代理iframe
var ifrproxy = document.createElement('iframe');
ifrproxy.style.display = 'none';
ifrproxy.src = page3 + '#somedata'; //page3与父页面在同一个域下
document.body.appendChild(ifrproxy);
} page3: 代理iframe页面
//因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值
parent.parent.location.hash = self.location.hash.substring(1);
缺点
方法一:安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞
方法二:数据直接暴露在了url中,数据容量和类型都有限s
参考
http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html
http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/
iframe及与页面之间的通信的更多相关文章
- 让微信小程序页面之间的通信不在变得困难
一个开始 小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如... 场景还原 首先这是一个电商小程序. 有这样一个需求: 首页某个地方要展示购物车商品数量. 当我在其他页面加购了商品 ...
- iframe嵌套的页面之间传值问题
项目中很多时候会遇到需要用 iframe 嵌套页面的情况.有时候会有这样的需求: iframe 嵌套的页面 A ,点击之后要跳到页面 B ,但是同时还需要 A 页面中的某个属性值. 此时可以先把 A ...
- html5 xdm 页面之间的通信
<!-- 这个是父页面xdm.html --><!DOCTYPE html> <html> <head> <meta charset=" ...
- 六)iframe 及父子页面之间获取元素、方法调用
http://www.w3school.com.cn/tags/tag_iframe.asp father.html <!DOCTYPE html> <html> <he ...
- iframe父子页面之间相互调用元素和函数
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...
- js 页面间的通信
看了一下公司原来的代码,原页面ajax post返回一个页面完整的HTML,然后再打开一个新页面并输出ajax返回的所有代码到新页面上,在新页面上以表单提交的形式实现重定向. 任凭我想了半天也没想出来 ...
- SSE两个页面的相互通信
两个页面之间互相通信 首先搭建express框架,然后通过two页面发送数据给服务器,服务器把数据传送给one页面 在two 中发送数据,在one中显示 router/index.js var axi ...
- 【JavsScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
- 【JavaScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
随机推荐
- FPGA浮点数定点化
因为在普通的fpga芯片里面,寄存器只可以表示无符号型,不可以表示小数,所以在计算比较精确的数值时,就需要做一些处理,不过在altera在Arria 10 中增加了硬核浮点DSP模块,这样更加适合硬件 ...
- VOOC还真算是OPPO的核心技术
经常电视看到OPPO打广告说它的VOOC,觉得好奇怪,就一个手机充电讲个不完,尽是骗3.4线城市的人,不过今天研究了一下,还VOOC真算是它的核心技术了. 现在选手机,电池和充电速度是非常重要的,首先 ...
- a:hover标签已经定义了text-decoration:none,并且生效,但是还是有下划线
a标签在F12计算出来的样式里 text-decoration:none; 确实有被应用到.但是链接的下划线并没有被去掉... 解决办法:p:commandLink <p:commandLink ...
- JS函数的参数声明中用 var 与不用 var的区别
1.var 声明的变量,作用域是当前 function 2.没有声明的变量,直接赋值的话, 会自动创建变量,但作用域是全局的. 例如: function doSth() { a = "AAA ...
- vue实现星级评价效果
希望对你们有用,已经自己试过可以的才发布出来的 效果如下: html: <template> <div class="evaStar"> <ul cl ...
- timeline时间轴进度“群英荟萃”
timeline时间轴进度“群英荟萃” 是日,无论PC项目还是APP,都涉及到了通常称谓的“时间轴”UI展现布局.产品和设计师都喜欢横向.纵向的时间轴来传达产品的寓意.如此,如斯!总结一套 time ...
- 架构师之路->架构师思维的培养
公司的CMS(综合赋码管理系统)是WINFORM的CS架构.这套系统的架构师换了3届,到现在已经几年没有架构师了.本来入职时,岗位目标就是这个“自动化架构师”. 后来和领导达成共识先争取成为储备架构师 ...
- 文字太多?控件太小?试试 TextView 的新特性 Autosizeing 吧!
Hi,大家好,我是承香墨影! Android 8.0 已经发布了有一阵子了,如果你有在关注它,你应该会知道它新增了一个对于 TextView 字体大小变动的新特性:Autosizing. 本身这个新特 ...
- jBPM学习之利用API完成流程实例
流程引擎对象ProcessEngine是jBPM4所有的Service API之源.在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见Proc ...
- 解决api 跨域 webconfig添加节点
<system.webServer><httpProtocol><customHeaders><add name="Access-Control-A ...