随着W3C一声令下,几年前使用非常频繁的frameset + frame已完成使命,光荣退伍。作为frameset的替代方案(姑且这么称吧),iframe的使用也多了起来。较frameset方案,iframe在使用上更加灵活,文档结构更加友好。

本文就js操作iframe在不同浏览器(没错,又是浏览器兼容…)的差异性做一些说明,力求总结出一个适应于所有主流浏览器的方案,笔者只测试了IE 6/7/8(以下简称IE)和FireFox 5.0(以下简称FF)。

约定与定义

iframeElement:指的是iframe的DOM元素表示,即用document.getElemenetById()等方法获取的DOM对象 iframeId: 指iframe的属性id,如<iframe id=”someid”> iframeName:指iframe的属性name,如<iframe name=”somename”> iframeIndex:从0开始编号的iframe索引,若页面中有N个frame,则其值范围为0 – n-1 iframeWindow:指的是iframe的window对象 标准浏览器:符合W3C标准的浏览器的统称,如FireFox

一、 在父页面中获取iframe的window对象

获得了window对象后,就可以调用iframe页面中定义的方法等。

IE:可以通过iframeId、window.iframeId、window.iframeName、 window.frames[iframeId]、window.frames[iframeName]、 window.frames[iframeIndex]和iframeElement.contentWindow这6种方法来获取iframe的 window对象。

FF:可以通过window.iframeName、window.frames[iframeName]和iframeElement.contentWindow这3种方法获取window对象。

总结:为了兼容大多数浏览器,应使用iframeElement.contentWindow来获取。见如下代码:

  1. <iframe id="iframe1" name=”iframe1” src="frame1.html"></iframe>
  2. <script type="text/javascript">
  3. //获取iframe的window对象
  4. var iframe = document.getElementById('iframe1').contentWindow;
  5. </script>

二、 在父页面中获取iframe的document对象

标准浏览器可以通过iframeElement.contentDocument来引用iframe的doument对象,但是IE浏览器(又是这斯…)不支持,确切说应该是IE 6/7,笔者发现在IE8中已经可以用此方法来获取了。

当然,因为document是window的一个子对象,你也可以先获取iframe的window对象,再通过window.document来引用。

总结:应使用以下两方法来获取,见代码:

  1. <iframe id="iframe1" src="frame1.html"></iframe>
  2. <script type="text/javascript">
  3. //获取iframe的document对象
  4. //方法1
  5. var iframe = document.getElementById('iframe1').contentWindow.document;
  6. //方法2
  7. function getIframeDom(iframeId) {
  8. return document.getElementById(iframeId).contentDocument || window.frames[iframeId].document;
  9. }
  10. </script>

三、 iframe页面获取父页面的window对象

parent:父页面window对象

top:顶层页面window对象

self:始终指向当前页面的window对象(与window等价)

适用于所有浏览器,当拿到了父页面的window对象后,就可以访问父页面定义的全局变量和函数,这在iframe交互里经常用到。

[JavaScript]JavaScript处理iframe的动作的更多相关文章

  1. selenium处理iframe和动作链

    selenium处理iframe和动作链 iframe iframe就是一个界面里嵌套了其他界面,这个时候selenium是不能从主界面找到子界面的属性,需要先找到子界面,再去找子界面的属性 动作链( ...

  2. 通过JavaScript自由切换iframe

    我发现我有很大的强迫症,如果看到别人的文章没有最终的效果图,我会毫不犹豫关掉这个页面.真的很炸毛这种,让我有很不舒服的体验:所以纵使网上有类似的了,我还是写一篇给那些跟我有同样症状的人阅读. 首先来学 ...

  3. Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID

    query取得iframe中元素的几种方法 在iframe子页面获取父页面元素代码如下: $('#objId', parent.document);// 搞定... 在父页面 获取iframe子页面的 ...

  4. javascript动态改变iframe的src

    页面中需要动态的改变iframe的地址,方法有: 1. window.frames["chartFrame"].document.location = "<%=ba ...

  5. [ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

    作为入门者来说.了解JavaScript中timer的工作方式是非常重要的.通常它们的表现行为并非那么地直观,而这是由于它们都处在一个单一线程中.让我们先来看一看三个用来创建以及操作timer的函数. ...

  6. javascript --- javascript与DOM

    javascript与DOM: 我们来个例子,一个HTML里包含一段文本和一个无序的列表. <p id="intro">My first paragraph...< ...

  7. JavaScript - javascript 中的 "||" 与 "&&" 的理解与灵活运

    你肯定见到过这样的代码:a = a||"xxx". 它其实就等价于下面三种形式的代码: a = a || "xxx"; 与: if (!a) { a = &qu ...

  8. JavaScript: JavaScript的简介和入门代码演示

    1.Javascript的发展历史介绍: javascript是指的实在网页上编写的编程语言,其主要是控制器html的动态显示效果.HTMl能带来的只是一些基本的页面的风格,而要展示的漂亮使用CSS, ...

  9. [JavaScript] JavaScript作用域深度解析

    JavaScript作用域 JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. -- JS权威指南 在JS里,一切皆对象,函数也是. 一.有什么用 什么时候会用到它? ...

随机推荐

  1. android studio学习之一

    一:ADT和sdk的区别 ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Andr ...

  2. Oracle10g RAC的简单操作

    1.查看OCR位置用户指定的位置会被放置在 /etc/oracle/ocr.loc(Liunx系统) 或 /var/opt/oracle/ocr.loc [oracle@rac4 opt]$ cat ...

  3. 判断两个IP是否属于同一子网

    描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据.子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”.利用子网掩码可以判断两台主机是否 ...

  4. ss命令

    看到好的博文,所以记录一下.本文出自转载. ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它 ...

  5. Mysql权限

    连接Oracle/Mysql数据库的配置 1.Oracle <context:property-placeholder location="jdbc.properties"/ ...

  6. Android课程---Activity 的生命周期

    activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...

  7. Ubuntu Linux上安装配置Mysql

    一.安装: 三种安装方式: 1. 从网上安装 sudo apt-get install mysql-server.装完已经自动配置好环境变量,可以直接使用mysql的命令. 注:建议将/etc/apt ...

  8. 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1bnQEldl iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. 实现服务器端与客户端的实时通信 SignalR(1)

    一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) 二.这篇文章介绍如何利用 VS2012 创建一个简单的实时聊天系统,建好后的样子如下(模拟三个在线用户):    三.Demo ...

  10. Thinking in Java——笔记(8)

    Polymorphism The polymorphic method call allows one type to express its distinction from another, si ...