关于Javascript与iframe的那些事儿

嵌入 iframe 的页面,父页面与子页面均可以很轻松的在同域或跨子域的情况下进行读写操作;在完全不同域的情况下,也可以通过更改 hash 的方式进行通信。下面我在九个不同(版本的)浏览器中对此进行数据传输与更改的兼容性测试。
同域或跨子域读写操作 iframe 里的内容
父页面读写操作子页面:


代码如下:

<iframe id="test-iframe" name="test-iframe" src="child.html" scrolling="no" frameborder="0"></iframe>
<script>
window.onload = function () {
  /*
   *  下面两种获取节点内容的方式都可以。
   *  由于 IE6, IE7 不支持 contentDocument 属性,所以此处用了通用的
   *  window.frames["iframe Name"] or window.frames[index]
   */
  var d = window.frames["test-iframe"].document;
  d.getElementsByTagName('h1')[0].innerHTML = 'pp';
  alert(d.getElementsByTagName('h1')[0].firstChild.data);
}
</script>

注:在请务必通过 window.onload 方法访问 iframe 中的节点,否则浏览器会提示错误-拒绝访问。在 IE8, Firefox3.6, Opera11 下在DOMReady 时也可以访问 iframe 中的节点。
子页面读写操作父页面:


代码如下:

<script>
  parent.document.getElementsByTagName('h1')[0].innerHTML = 'pp';
  alert(parent.document.getElementsByTagName('h1')[0].firstChild.data);
</script>

小结:
•1 测试通过 IE6, IE7, IE8, Firefox2.0, Firefox3.0, Firefox3.6, Chrome8, Opera11, Safari5.
•2 查阅资料得出 document.getElementById(‘id name').contentDocument 全等于 window.frames["iframe Name"].document.
•3 跨子域时,需要在父页面和子页面 JS 中分别加上 document.domain = 'xxx.com';
跨域操作 iframe 里内容
当两个网页所在域不同时,要实现数据的互相调用,只能通过 JS 改变 location 对象的 hash 属性的值来做到互相通信。
父页面:


代码如下:

<iframe id="test-iframe" src="http://www.yyy.com/child.html" scrolling="no" frameborder="0"></iframe>
<input type="button" value="send" onclick="sendRequest()" />
<script>
function sendRequest() {
  document.getElementById('test-iframe').src += '#a';
}
var interval = window.setInterval(function(){
  if(location.hash) {
    alert(location.hash);
    window.clearInterval(interval);
  }
},1000);
</script>

子页面:


代码如下:

<h1>RRRRRR</h1>
<script>
var url = 'http://www.xxx.com/father.html';
    oldHash = self.location.hash,
    newHash,
    interval = window.setInterval(function(){
        newHash = self.location.hash;
        if(oldHash != self.location.hash) {
        document.getElementsByTagName('h1')[0].innerHTML = 'pp';
        //alert(parent.location.href); //去掉这个注释,浏览器会提示无权限
        parent.location.href = url + '#b';
          window.clearInterval(interval);
        }
    },500);
</script>

小结:
•1 经测试 IE6, IE7, IE8, Firefox2.0, Firefox3.0, Firefox3.6, Chrome8, Opera11, Safari5, 除 IE6, IE7 外只要改变hash 就会记录在浏览器 history 中。
•2 我有试图在子页面用 parent.location.replace 的方法来避免父页面向服务器发送请求而进行跳转,这样理论上浏览器就不会记录历史,但未能奏效。
•2 子页面无权读取父页面的 url, 但可以对父页面的 url 进行写操作,所以跨域操作时,要提前得知父页面的url
由于前端解决跨域问题的局限性比较大,所以最好用服务器端解决方案

(0)

相关推荐

  • javascript iFrame研究

    Iframe学习 function changeSrc(){ var i1 = document.getElementById("iframe1"); i1.src = "http://www.kanshule.com"; } function getText(){ //var x = document.getElementById("iframe1").contentDocument;//此法不通 var x = window.frames[&

  • javascript+iframe 实现无刷新载入整页的代码

    jquery有一个load()方法,使用方法如:$("#div").load("/index.html");这样就可以将index.html加载到ID为div的容器中, 用iframe也可以实现,但没有上述做法完美,参见discuz那些网站,如登陆弹出一个层,也是载入的一个页面,但我发现状态栏左边出现的是 正在打开about:blank,不知道是不是将iframe的src设为about:blank,然后在编辑iframe呢?但注意了,查看源代码的时候却看不到载入页面

  • javascript控制frame,iframe的src属性代码

    复制代码 代码如下: <script language="javascript"> <!-- function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r!=null) retur

  • javascript 装载iframe子页面,自适应高度

    假设主页面有一个div,里面放置一个iframe 复制代码 代码如下: <div id="frameBox"> <iframe id="frameWin" src="1.html" name="opWin" style="width:100%; height:100% " frameborder="0" scrolling="no"></

  • 兼容IE和Firefox的javascript获取iframe文档内容的函数

    复制代码 代码如下: <script type="text/javascript"> function getIframeContent(){ //获取iframe中文档内容 var doc; if (document.all){//IE doc = document.frames["MyIFrame"].document; }else{//Firefox doc = document.getElementById("MyIFrame"

  • javascript开发随笔3 开发iframe富文本编辑器的一点体会

    就把遇到的问题记录一下.写这篇文章时用的TinyMCE编辑器就很强大,但毕竟是第三方的,项目也考虑了这些,如果做些自定义的东西不太方便. 1. 判断光标位置的元素(或者选中的部分)的样式.光标位置改变的时候更新工具栏对应按钮的样式.什么情况下光标的位置会改变呢?是键盘方向键和鼠标点击,于是就判断键盘事件和鼠标事件来执行光标移动的处理. a. 获得光标位置或选中元素:首先getSelection,创建range.然后获得元素,获取到元素之后就可以或得样式.tagName等等,做更多的操作,运行代码

  • JavaScript iframe的相互操作浅析

    iframe元素也就是文档中的文档,或者好像浮动的框架(frame).关于iframe的操作一直是一个疑难点,网上有很多这方面的文章介绍.下面我结合自己的经验,整理一下笔记记录下来.一.页面三个页面:父页面和两个子页面,两个子页面在父页面的两个iframe里.1.父页面MainForm.aspx<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MainForm.aspx.cs"

  • javascript 网站常用的iframe分割

    中间那个控制块,其实也是一个iframe,把他的宽度定义为10. 然后在他的内部js,控制 左右2个iframe. 复制代码 代码如下: function switchSysBar(){ if (parent.document.getElementById('attachucp').cols=="160,10,*"){ document.getElementById('leftbar').style.display=""; parent.document.getEl

  • javascript iframe中打开文件,并检测iframe存在否

    不过是iframe[name]的话,就涉及onload的问题了...所以就麻烦了许多.... 以下只是加了延迟...并没有"真正"的处理onload的问题....其实可以循环window.open来解决,不过懒的弄就略了...^^ <a href="javascript:void(0);" onclick="openC('http://www.jb51.net/', 'cs', this)">jb51.net</a> &l

  • 执行iframe中的javascript方法

    复制代码 代码如下: document.getElementById("iframeId").contentWindow.functionName(); 复制代码 代码如下: window.frames['framename'].functionName();

  • javascript iframe编程相关代码

    最近在处理几个项目中都用到了iframe,有时一个页面中有多个iframe,而且几个iframe需要相互访问彼此的函数或者父窗口的函数.今天有空就将页面框架编程做个整理. 一个页面中的所有框架以集合的形式作为window对象的属性提供,例如:window.frames就表示该页面内所有框架的集合,这和表单对象.链接对象.图片对象等是类似的,不同的是,这些集合是document的属性.因此,要引用一个子框架,可以使用如下语法: 复制代码 代码如下: window.frames["frameName

  • javascript之可拖动的iframe效果代码

    // HISTORY// ------------------------------------------------------------------// Jan 23, 2004: Fixed problems which caused the script not to work in//               some framed situations. Improved browser support.//               Added easier "addH

  • javascript iframe内的函数调用实现方法

    sxmsxm.html 复制代码 代码如下: <script> function sonfun() { alert('ok'); } </script> main.html 复制代码 代码如下: <iframe id="sxm" src="sxmsxm.html" width='100' height='100'></iframe> 在main.html中执行 sxmsxm.html中的sonfun() 有两种方式 1

  • javascript IFrame 强制刷新代码

    当第一次从主窗口进入到一个iframe简称{A}中,此时这个{A}中呈现的数据是新的,这时我又点了另外的一个iframe简称{B},这里{B}的数据也是新的,在{B}中进行一些逻辑处理,如向{A}中批量增加模型数据,这里我们再进入到{A}中会发现数据是被缓存着的.因为是从{B}中对批量操作了{A}的数据,{B}是与server通信的,也就是会进行逻辑层/持久层操作,这样server端更新的呈现部分是{B}而不是全部,这也就是局部刷新,只刷{B}.而我们需要做的是让{A}中的内容也跟着变. 解决方

  • 通过javascript获取iframe里的值示例代码

    复制代码 代码如下: <script type="text/javascript" language="javascript"> function CCCC(){ var File_NAME=""; var count=0; if(document.frames("myFrame").document.all.length){ for(var i=0;i<document.all.length;i++){ i

  • JavaScript自动设置IFrame高度的小例子

    复制代码 代码如下: function SetIFrameHeight(down) {         var Sys = {};         var ua = navigator.userAgent.toLowerCase();         var s;         (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :         (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox =

  • JavaScript设置IFrame高度自适应(兼容各主流浏览器)

    复制代码 代码如下: function SetIFrameHeight(down) { var Sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/

  • JavaScript 处理Iframe自适应高度(同或不同域名下)

    1.同域名下Iframe自适应高度的处理 复制代码 代码如下: <iframe onload="Javascript:SetIFrameHeight(this)" src="../Home/b" id="win" name="win" width="100%" height="1"> </iframe> 当然此处我用的是Asp.Net MVC 此处src设置为路由

随机推荐