获取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及与页面之间的通信的更多相关文章

  1. 让微信小程序页面之间的通信不在变得困难

    一个开始 小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如... 场景还原 首先这是一个电商小程序. 有这样一个需求: 首页某个地方要展示购物车商品数量. 当我在其他页面加购了商品 ...

  2. iframe嵌套的页面之间传值问题

    项目中很多时候会遇到需要用 iframe 嵌套页面的情况.有时候会有这样的需求: iframe 嵌套的页面 A ,点击之后要跳到页面 B ,但是同时还需要 A 页面中的某个属性值. 此时可以先把 A ...

  3. html5 xdm 页面之间的通信

    <!-- 这个是父页面xdm.html --><!DOCTYPE html> <html> <head> <meta charset=" ...

  4. 六)iframe 及父子页面之间获取元素、方法调用

    http://www.w3school.com.cn/tags/tag_iframe.asp father.html <!DOCTYPE html> <html> <he ...

  5. iframe父子页面之间相互调用元素和函数

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. js 页面间的通信

    看了一下公司原来的代码,原页面ajax post返回一个页面完整的HTML,然后再打开一个新页面并输出ajax返回的所有代码到新页面上,在新页面上以表单提交的形式实现重定向. 任凭我想了半天也没想出来 ...

  7. SSE两个页面的相互通信

    两个页面之间互相通信 首先搭建express框架,然后通过two页面发送数据给服务器,服务器把数据传送给one页面 在two 中发送数据,在one中显示 router/index.js var axi ...

  8. 【JavsScript】父子页面之间跨域通信的方法

    由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...

  9. 【JavaScript】父子页面之间跨域通信的方法

    由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...

随机推荐

  1. FPGA浮点数定点化

    因为在普通的fpga芯片里面,寄存器只可以表示无符号型,不可以表示小数,所以在计算比较精确的数值时,就需要做一些处理,不过在altera在Arria 10 中增加了硬核浮点DSP模块,这样更加适合硬件 ...

  2. VOOC还真算是OPPO的核心技术

    经常电视看到OPPO打广告说它的VOOC,觉得好奇怪,就一个手机充电讲个不完,尽是骗3.4线城市的人,不过今天研究了一下,还VOOC真算是它的核心技术了. 现在选手机,电池和充电速度是非常重要的,首先 ...

  3. a:hover标签已经定义了text-decoration:none,并且生效,但是还是有下划线

    a标签在F12计算出来的样式里 text-decoration:none; 确实有被应用到.但是链接的下划线并没有被去掉... 解决办法:p:commandLink <p:commandLink ...

  4. JS函数的参数声明中用 var 与不用 var的区别

    1.var 声明的变量,作用域是当前 function 2.没有声明的变量,直接赋值的话, 会自动创建变量,但作用域是全局的. 例如: function doSth() { a = "AAA ...

  5. vue实现星级评价效果

    希望对你们有用,已经自己试过可以的才发布出来的 效果如下: html: <template> <div class="evaStar"> <ul cl ...

  6. timeline时间轴进度“群英荟萃”

    timeline时间轴进度“群英荟萃”  是日,无论PC项目还是APP,都涉及到了通常称谓的“时间轴”UI展现布局.产品和设计师都喜欢横向.纵向的时间轴来传达产品的寓意.如此,如斯!总结一套 time ...

  7. 架构师之路->架构师思维的培养

    公司的CMS(综合赋码管理系统)是WINFORM的CS架构.这套系统的架构师换了3届,到现在已经几年没有架构师了.本来入职时,岗位目标就是这个“自动化架构师”. 后来和领导达成共识先争取成为储备架构师 ...

  8. 文字太多?控件太小?试试 TextView 的新特性 Autosizeing 吧!

    Hi,大家好,我是承香墨影! Android 8.0 已经发布了有一阵子了,如果你有在关注它,你应该会知道它新增了一个对于 TextView 字体大小变动的新特性:Autosizing. 本身这个新特 ...

  9. jBPM学习之利用API完成流程实例

    流程引擎对象ProcessEngine是jBPM4所有的Service API之源.在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见Proc ...

  10. 解决api 跨域 webconfig添加节点

    <system.webServer><httpProtocol><customHeaders><add name="Access-Control-A ...