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 相关文章推荐
JavaScript 克隆数组最简单的方法
Feb 12 Javascript
juqery 学习之五 文档处理 插入
Feb 11 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
Apr 29 Javascript
javascript在IE下trim函数无法使用的解决方法
Sep 12 Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
浅谈React组件之性能优化
Mar 02 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
node实现的爬虫功能示例
May 04 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
vue.js实现只能输入数字的输入框
Oct 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 正则学习实例
2008/07/30 PHP
深入密码加salt原理的分析
2013/06/06 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
JS 继承实例分析
2008/11/04 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
javascript常用功能汇总
2015/07/05 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python FFT合成波形的实例
2019/12/04 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
物业管理计划书
2014/01/10 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
服装店营销方案
2014/03/10 职场文书
机电一体化求职信
2014/03/10 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python