JavaScript 父子页面相互调用总结
父子页面相互调用是一个在开发中经常遇到的问题,但是没有找到过比较全面的文章介绍。在此总结下来,供大家参考。
四种方式
一般情况下,我们可以使用iframe、window的open、showModalDialog、showModelessDialog方法这四种方式打开一个子窗口。(showModalDialog、showModelessDialog是IE独有的。)
下面分这四种方式来讨论如何父子页面互相调用。
分情况讨论
iframe
在这种情况下,子页面直接通过parent.var就可以对父页面的变量和方法进行操作。
父页面可以通过拿到iframe的contentWindow对象来访问子页面的window。
父页面代码,文件名为iframe.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <script> var testVar = "我是父窗口测试变量"; var childFrame; function getChildVar(){ var childFrame = document.getElementById("childFrame"); var childWindow = childFrame.contentWindow alert(childWindow.testVar); } </script> <iframe id="childFrame" name="childFrame" frameBorder="0" src="iframe.child.html" style="border:1px solid black;"> </iframe> <br /> <button onclick="getChildVar();">拿到子页面的变量</button> </body> </html> |
子页面代码,文件名为iframe.child.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <script> var testVar = "我是子窗口测试变量"; </script> 我是在IFrame中的子窗体。 <button onclick="alert(parent.testVar);">拿到父页面的testVar</button> </body> </html> |
open
使用window.open打开的子页面,在子页面中可以通过window.opener来访问父页面的window对象。
在父页面中,可以通过window.open方法的返回值拿到子页面的window,就可以操作子页面的变量和方法。
父页面代码,文件名为window.open.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>window.open父页面</title> </head> <body> <script> var testVar = "我是父窗口测试变量"; var childFrame; function openWindow(){ childFrame = window.open("window.open.child.html"); } function getChildVar(){ alert(childFrame.testVar); } </script> <button onclick="openWindow();">使用window.open打开子页面</button> <button onclick="getChildVar();">拿到子页面的变量</button> </body> </html> |
子页面代码,文件名为window.open.child.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>window.open子页面</title> </head> <body> <script> var testVar = "我是子窗口测试变量"; alert(window.opener.testVar); </script> </body> </html> |
showModalDialog
使用showModalDialog打开的子页面,如果想访问父页面的window,需要在执行showModalDialog方法的时候,把父页面的window当作参数传递过去。见父页面的代码。
因为showModalDialog是阻塞的,父页面的代码在子页面不关闭之前无法继续执行,所以只能通过returnValue拿到子页面的变量,见子页面的代码。
父页面代码,文件名为ShowModalDialog.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>ShowModalDialog父页面</title> </head> <body> <script> var testVar = "我是父窗口测试变量"; function openDialog(){ var testVar = showModalDialog("ShowModalDialog.Child.html",window); alert(testVar); } </script> <button onclick="openDialog();">OpenDialog</button> </body> </html> |
子页面代码,文件名为ShowModalDialog.Child.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>ShowModalDialog子页面</title> </head> <body> <script> var testVar = "我是子窗口测试变量"; function getParent(){ var parentWindow = window.dialogArguments; alert(parentWindow.testVar); } function closeMe(){ returnValue = testVar; window.close(); } </script> 我是使用ShowModalDialog打开的子页面。 <br /> <button onclick="getParent()">getParent</button> <button onclick="closeMe()">closeMe</button> </body> </html> |
showModelessDialog
使用showModelessDialog打开的子页面,同样需要在执行方法的时候,把父页面的window当作参数传递过去。
但不同之处在于showModelessDialog会直接返回子页面的window对象,不是阻塞的,可以直接对子页面的方法和变量进行访问。
父页面代码,文件名为ShowModelessDialog.html:
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>ShowModalDialog父页面</title> </head> <body> <script> var testVar = "我是父窗口测试变量"; function openDialog(){ var childWindow = showModelessDialog("ShowModelessDialog.Child.html",window); alert(childWindow.testVar); } </script> <button onclick="openDialog();">OpenDialog</button> </body> </html> |
子页面代码,文件名为ShowModelessDialog.html。
|
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>ShowModalDialog子页面</title> </head> <body> <script> var testVar = "我是子窗口测试变量"; function getParent(){ var parentWindow = window.dialogArguments; alert(parentWindow.testVar); } function closeMe(){ returnValue = testVar; window.close(); } </script> 我是使用ShowModalDialog打开的子页面。 <br /> <button onclick="getParent()">getParent</button> <button onclick="closeMe()">closeMe</button> </body> </html> |
JavaScript 父子页面相互调用总结的更多相关文章
- JQuery javascript实现父子页面相互调用
javascript实现父子页面相互调用 By:授客 QQ:1033553122 场景1 父页面调用子页面 如上图,在iframe子页面的<script>元素中,定义了taskStatus ...
- iframe父子页面相互调用方法,相互获取元素
父页面获取子页面 var childWin = document.getElementById('setIframe').contentWindow;//获取子页面窗口对象 childWin.send ...
- ASP.net关于C#代码与javaScript函数的相互调用
C#代码与javaScript函数的相互调用 问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在 ...
- Flex父子窗口相互调用
Flex父子窗口相互调用 1.设计思路 (1)子窗口调用父窗口的方法 (2)子窗口做了修改后,返回父窗口,父窗口调用子窗口函数 2.设计源码 (1)父窗口 ParentWindow.mxml: < ...
- Flex父子窗体相互调用
Flex父子窗体相互调用 1.设计思路 (1)子窗体调用父窗体的方法 (2)子窗体做了改动后,返回父窗体,父窗体调用子窗体函数 2.设计源代码 (1)父窗体 ParentWindow.mxml: &l ...
- vue中的父子组件相互调用
vue中的父子组件相互调用: 1.vue子组件调用父组件方法:子组件:this.$emit('xx'); 父组件:定义yy方法,并在引用子组件时传参,如@xx="yy" 2.vue ...
- iframe 父子页面方法调用
在写代码的时候经常会用到将一个网页嵌入到另一个网页中,w3c也规定了一个标签<iframe>,这个标签本身就支持跨域,而且所有的浏览器都支持 iframe具有以下属性: 1.framebo ...
- C++和JavaScript脚本的相互调用
脚本调用C++相对比较容易,使用ATL组件只需要抛双接口即可,但在exe里如何做到呢?本文实现了在exe里脚本和C++的相互调用.在EXE里也需要对外抛送一个继承自IDispatch的接口.并需要重载 ...
- JavaScript父子页面之间的相互调用
父页面: <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>< ...
随机推荐
- 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */
namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...
- nopcommerce的WidgetZones
来自:http://www.kingreatwill.com Hi, Having just started developing nopCommerce (and having forked out ...
- "=="和equals方法究竟有什么区别?
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同, ...
- Exceptionless 本地部署踩坑记录
仅已此文记录 Exceptionless 本地部署所遇到的问题 1.安装ElasticSearch文本 执行elasticsearch目录中的elasticsearch.bat 没有执行成功. 使用命 ...
- 第7章 DNS & bind从基础到深入
本文目录: 7.1 DNS必懂基础 7.1.1 域的分类 7.1.2 主机名.域名.FQDN 7.1.3 域的分层授权 7.1.4 DNS解析流程 7.2 DNS术语 7.2.1 递归查询和迭代查询 ...
- 开心的金明 NOIP 2006 普及组
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就 ...
- linux 编译安装详解
相信大家大多都听过linux 的编译安装,但它到底是怎么把源代码变为自己电脑里可以应用的软件哪?今天,小编就以httpd 为例详细讲解一下. 什么是编译安装--编译:将源代码变为机器可执行的代码文件. ...
- 专业辟谣----ThinkSNS不仅仅是微博程序!
[摘要]ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+. ThinkSNS这个词,第一眼应该想到的 ...
- C3P0数据库连接池使用中的问题
java.io.FileNotFoundException: D:\javaStudy\javaee\.metadata\.plugins\org.eclipse.wst.server.core\tm ...
- mysql 时间格式化
将时间转为格式化的字符串 select date_format(now(),'%Y%m%d'); 将时间字符串转为时间戳 select unix_timestamp('2017-07-14') 将时间 ...