博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iframe 与主框架相互访问方法
阅读量:7243 次
发布时间:2019-06-29

本文共 3882 字,大约阅读时间需要 12 分钟。

hot3.png

1.同域相互访问

假设A.html 与 b.html domain都是localhost (同域)

A.html中iframe 嵌入 B.html,name=myframe

A.html有js function fMain()

B.html有js function fIframe()

需要实现 A.html 调用 B.html 的 fIframe(),B.html 调用 A.html 的 fMain()

A.html

      
    
 main window       
    // main js function    function fMain(){      alert('main function execute success');    }      // exec iframe function    function exec_iframe(){      window.myframe.fIframe();    }                  

A.html main

    

    
     

B.html

         
    
 iframe window       
    // iframe js function     function fIframe(){      alert('iframe function execute success');    }      // exec main function    function exec_main(){      parent.fMain();    }                  

B.html iframe

    

     

点击A.html 的 exec iframe function button,执行成功,弹出iframe function execute success。如下图

点击B.html 的 exec main function button,执行成功,弹出 main function execute success。如下图

2.跨域互相访问

假设 A.html domain是 localhost, B.html domain 是 127.0.0.1 (跨域)

这里使用 localhost 与 127.0.0.1 只是方便测试,localhost 与 127.0.0.1已经不同一个域,因此执行效果是一样的。

实际使用时换成 www.domaina.com 与 www.domainb.com 即可。

A.html中iframe 嵌入 B.html,name=myframe

A.html有js function fMain()

B.html有js function fIframe()

需要实现 A.html 调用 B.html 的 fIframe(),B.html 调用 A.html 的 fMain() (跨域调用)

如果使用上面同域的方法,浏览器判断A.html 与 B.html 不同域,会有错误提示。

Uncaught SecurityError: Blocked a frame with origin "http://localhost" from accessing a frame with origin "http://127.0.0.1". Protocols, domains, and ports must match.

实现原理:

因为浏览器为了安全,禁止了不同域访问。因此只要调用与执行的双方是同域则可以相互访问

首先,A.html 如何调用B.html的 fIframe方法

1.在A.html 创建一个 iframe

2.iframe的页面放在 B.html 同域下,命名为execB.html

3.execB.html 里有调用B.html fIframe方法的js调用

  parent.window.myframe.fIframe(); // execute parent myframe fIframe function  

这样A.html 就能通过 execB.html 调用 B.html 的 fIframe 方法了。

同理,B.html 需要调用A.html fMain方法,需要在B.html 嵌入与A.html 同域的 execA.html 

execA.html 里有调用 A.html fMain 方法的js 调用

  parent.parent.fMain(); // execute main function  

 这样就能实现 A.html 与 B.html 跨域相互调用。

A.html

         
    
 main window       
      // main js function    function fMain(){      alert('main function execute success');    }      // exec iframe function    function exec_iframe(){      if(typeof(exec_obj)=='undefined'){          exec_obj = document.createElement('iframe');          exec_obj.name = 'tmp_frame';          exec_obj.src = 'http://127.0.0.1/execB.html';          exec_obj.style.display = 'none';          document.body.appendChild(exec_obj);      }else{          exec_obj.src = 'http://127.0.0.1/execB.html?' + Math.random();      }    }                  

A.html main

    

    
     

B.html

         
    
 iframe window       
    // iframe js function     function fIframe(){      alert('iframe function execute success');    }      // exec main function    function exec_main(){      if(typeof(exec_obj)=='undefined'){          exec_obj = document.createElement('iframe');          exec_obj.name = 'tmp_frame';          exec_obj.src = 'http://localhost/execA.html';          exec_obj.style.display = 'none';          document.body.appendChild(exec_obj);      }else{          exec_obj.src = 'http://localhost/execA.html?' + Math.random();      }    }                  

B.html iframe

    

     

execA.html

         
    
 exec main function               
          parent.parent.fMain(); // execute main function           

execB.html

         
    
 exec iframe function               
          parent.window.myframe.fIframe(); // execute parent myframe fIframe function           

执行如下图:

转载于:https://my.oschina.net/u/874424/blog/495060

你可能感兴趣的文章
前端调错(一)---ajax返回数据成功,却进入error方法
查看>>
Java千百问_05面向对象(009)_java的多态性都有什么表现
查看>>
SQL Server分页3种方案比拼[转]
查看>>
《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
查看>>
每周一道数据结构(四)A*算法&博弈树α-β剪枝
查看>>
MySQL内核月报 2014.12-MySQL· 踩过的坑·5.6 GTID 和存储引擎那会事
查看>>
RHCE 学习笔记(20) ACL
查看>>
图片上传并转成灰白图片
查看>>
C语言函数
查看>>
iCalendar格式中关于RRule的解析和生成
查看>>
程序员的量化交易之路(15)--Cointrader之EntityBase类(3)
查看>>
Maven使用笔记(二)Eclipse中maven项目添加依赖
查看>>
9 个开始使用 C++11 的理由
查看>>
selenium-webdriver(python) (十六) --unittest 框架
查看>>
高可用Hadoop平台-答疑篇
查看>>
跟我一起数据挖掘(9)——R语言
查看>>
Silverlight实用窍门系列:49.Silverlight中管理独立存储--Isolated Storage【附带实例源码】...
查看>>
[perl]数据相关
查看>>
Oracle数据库锁表及解锁进程
查看>>
CSS魔法堂:Absolute Positioning就这个样
查看>>