JavaScript iframe的相互操作浅析


Posted in Javascript onOctober 14, 2009

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MainForm.aspx.cs" Inherits="Test.MainForm" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <ul>
            <li>
                父页面(文本失去焦点可看结果):<input id="txtParent" name="txtParent" type="text" value="parent" onblur="iframeTest()" />
            </li>
            <li>
                <iframe src="FrameA.aspx" id="iframeA"></iframe>
            </li>
            <li>
                <iframe src="FrameB.aspx" id="iframeB"></iframe>
            </li>
        </ul>
    </div>    <script type="text/javascript">        function iframeTest() {        }    </script>    </form>
</body>
</html>

2、子页面A

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FrameA.aspx.cs" Inherits="Test.FrameA" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>    <script type="text/javascript">        //子页面与父页面之间的操作  
        function getParent() {        }        //当前子页面与另外一个子页面之间的操作
        function getAnotherChild() {        }
    </script></head>
<body>
    <form id="form1" runat="server">
    <div>
         子页面1(文本失去焦点可看结果):<input id="txtUserName" name="txtUserName" type="text" value="jeff wong" onblur="getParent()" />
    </div>
    </form>
</body>
</html>

3、子页面B

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FrameB.aspx.cs" Inherits="Test.FrameB" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        子页面2(文本失去焦点可看结果):<input id="txtUserNameB" name="txtUserNameB" type="text"  value="jeffery zhao"/>
    </div>
    </form>
</body>
</html>

二、操作
1、父页面操作子页面
这个毫无疑问要在父页面MainForm.aspx文件里实现。我们修改父页面的javascript函数iframeTest,看父页面如何获取和操作子页面元素的:

        function iframeTest() {
            var frame1 = document.getElementById("iframeA");
            var frame2 = document.getElementById("iframeB");            var frameA = document.frames["iframeA"]; //等价于 var frameAa = document.frames.iframeA;
            var frameB = document.frames["iframeB"]; //等价于 var frameBb = document.frames.iframeB;            //**********************************************
            alert(frame1 == frameA); //false
            alert(frame2 == frameB); //false            alert(frame1.src); //FrameA.aspx
            alert(frame1.location); //undefined
            alert(frameA.src); //undefined            alert(frameA.location); //location
            alert(frameA.document.location);            alert(frame1.document.body.innerHTML); //这里返回的是MainForm.aspx的body里的innerHTML
            alert(frame1.document.documentElement.innerHTML); //这里返回的是MainForm.aspx的html里的innerHTML            alert(frameA.document.body.innerHTML); //这里返回的是FrameA.aspx的body里的innerHTML
            alert(frameA.document.documentElement.innerHTML); //这里返回的是FrameA.aspx的html里的innerHTML            //**********************************************   
            var childFrameDoc = undefined;            //取FrameA.aspx内的input文本
            if (document.all) {//IE
                childFrameDoc = frameA.document; //*** 如果是frame1,就取不到FrameA.aspx页面里的input ***
            } else {//Firefox
                childFrameDoc = frameA.contentDocument;
            }
            alert(childFrameDoc.body.innerHTML);            var childTxt = childFrameDoc.getElementById("txtUserName");
            var childTxtByName = childFrameDoc.getElementsByName("txtUserName");            alert(childTxt == childTxtByName[0]); //true
            alert(childTxt.value); //jeff wong
            alert(childTxtByName[0].value); // jeff wong
            //取FrameB.aspx内的input文本
            childFrameDoc = undefined;
            if (document.all) {//IE
                childFrameDoc = frameB.document;
            } else {//Firefox
                childFrameDoc = frameB.contentDocument;
            }
            alert(childFrameDoc.body.innerHTML);            var childTxt = childFrameDoc.getElementById("txtUserNameB");
            var childTxtByName = childFrameDoc.getElementsByName("txtUserNameB");            alert(childTxt == childTxtByName[0]); //true
            alert(childTxt.value); //jeffery zhao
            alert(childTxtByName[0].value); // jeffery zhao        }

 小结:
a、通过iframe对象所在页面的对象模型(通过document.getElementById("iframeId")获取),你可以访问iframe对象的属性,但不能访问其内容。
b、frames集合提供了对iframe内容的访问(通过document.frames["iframeName"]获取)。通常情况下我们都使用frames集合读写iframe内包含的元素。
c、 如果只想改变iframe的src或者border, scrolling等attributes(与property不是一个概念,property是不能写在标签内的,比 如:scrollHeight,innerHTML等),就需要用到document.getElementById方法.
d、要想使用iframe内的函数或dom元素(比如想得到iframe的document.body的内容),变量就必须通过frames集合.因为它取的是一个完整的DOM模型,而通过id获取的方法只是取出了一个object而已.
e、如果在iframe的页面未完全装载的时候,调用iframe的dom模型,会发生错误.

2、子页面操作父页面
这里以子页面FrameA.aspx举例。在子页面A中,我们通过函数getParent获取MainForm.aspx的dom元素,然后按照正常的dom元素操作就是了:

 

        //子页面与父页面之间的操作  
        function getParent() {
            if (self != top) {
                var oDoc = top.parent.document;
                alert(oDoc.body.innerHTML); 
                alert(oDoc.documentElement.innerHTML); 
                alert(oDoc.frames.length); //返回结果:2  表明父页面有两个iframe                //操作父页面的文本框
                var oTxt = oDoc.getElementById("txtParent");
                alert(oTxt.value);            }
            else alert("不在框架中");
        }

3、子页面操作子页面
这个还要借助主页面间接获取另一个子页面。这里还以子页面A来举例。通过主页面,我们间接获取了子页面B,然后像正常操作dom一样,子页面A完成对子页面B的控制和操作。
先修改getAnotherChild()函数:

 

        //当前子页面与另外一个子页面之间的操作
        function getAnotherChild() {
            alert(self.location.href); //当前页面的url            //通过父页面,间接获取另外一个子页面
            if (self != top) {
                var oDoc = top.parent.document;
                var oAnotherFrame = oDoc.frames["iframeB"]; //返回另外一个iframe                alert(oAnotherFrame.location);
                alert(oAnotherFrame.document.body.innerHTML);
                alert(oAnotherFrame.document.documentElement.innerHTML);                var oTxt = oAnotherFrame.document.getElementById("txtUserNameB");
                alert(oTxt.value); //jeffery zhao
            }
        }

 注意:修改完getAnotherChild()函数,然后将子页面A(FrameA.aspx)中的textUserName的onblur事件改为 onblur="getAnotherChild()"就可以看到结果了.

Javascript 相关文章推荐
js常用代码段整理
Nov 30 Javascript
js hover 定时器(实例代码)
Nov 12 Javascript
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
Jquery给基本控件的取值、赋值示例
May 23 Javascript
jQuery多条件筛选如何实现
Nov 04 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
JavaScript利用Date实现简单的倒计时实例
Jan 12 Javascript
BootStrap表单时间选择器详解
May 09 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
Dec 12 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
JavaScript实现仿Clock ISO时钟
Jun 29 Javascript
ajaxfileupload.js实现上传文件功能
Apr 19 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 #Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 #Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 #Javascript
jquery 常用操作整理 基础入门篇
Oct 14 #Javascript
一些技巧性实用js代码小结
Oct 14 #Javascript
Jquery 学习笔记(一)
Oct 13 #Javascript
extjs 学习笔记(二) Ext.Element类
Oct 13 #Javascript
You might like
浅析PHP水印技术
2007/02/14 PHP
PHP编码规范-php coding standard
2007/03/16 PHP
PHP校验ISBN码的函数代码
2011/01/17 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
Python中操作MySQL入门实例
2015/02/08 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Python贪心算法实例小结
2018/04/22 Python
浅谈django orm 优化
2018/08/18 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
python中判断文件结束符的具体方法
2020/08/04 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
SQL面试题
2013/12/09 面试题
法律专业应届本科毕业生求职信
2013/10/25 职场文书
教育科研先进个人材料
2014/01/26 职场文书
安全技术说明书
2014/05/09 职场文书
食品安全处置方案
2014/06/14 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书