`

【转】JavaScript 实现父,子页面(窗口)方法之间的相互调用

阅读更多
其实自己做过这方面的东西,一直想记录下来,但是一直没时间,正准备开始的时候,发现已经有达人已经做过了,发现比较有借鉴价值,所以就摘过来了(http://www.iteye.com/topic/295075),闲着也是闲着,索性自己就把他的整个搬过来了。。。然后准备加些内容,那么现在开始。

window.parent与window.opener的区别 javascript调用主窗口方法
1:   window.parent 是iframe页面调用父页面对象
举例:
a.html

<html>
    <head><title>父页面</title></head>
<body>
    <form name="form1" id="form1">
         <input type="text" name="username" id="username"/>
    </form>
    <iframe src="b.html" width=100%></iframe>
</body>
</html>

如果我们需要在b.htm中要对a.htm中的username文本框赋值,就如很多上传功能,上传功能页在Ifrmae中,上传成功后把上传后的路径放入父页面的文本框中
我们应该在b.html中写

<script type="text/javascript">
    var _parentWin = window.parent ;
    _parentWin.form1.username.value = "xxxx" ;
</script>

实例地址:  http://www.cnspry.cn/blog/attachments/window.parent 实例/a.html
源码:
1.a.html

<html>
<head>
	<title>主页面</title>
	<script>
		/** 为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量 */
		var parentVairous = "为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量";
		function parentInvokeIFrame()
		{
				var iframeTest = document.frames["iframeTest"]; //使用document.getElementById("iframeTest");同样可以
				alert(iframeTest.document.body.innerHTML);
				alert(iframeTest.iFrameVair);
		}
	</script>
</head>
<body>
<form name="form1" id="form1">
    <input type="text" name="username" id="username"/>
    <input type = "button" value = "父窗口调用IFrame子窗口中的内容" onclick = 'parentInvokeIFrame()'/>
</form>
<iframe src="b.html" width = '100%' id = 'iframeTest'></iframe>
</body>
</html>

1.b.html 代码

<html>
     <head>
         <title></title>
         <script type="text/javascript">
         	/** 为测试父窗体调用IFrame子窗体的全局函数而添加的子窗口全局函数 */
         var iFrameVair = "测试父窗体调用IFrame子窗体的全局函数";
         
         function UpdateParent()
         {
             var _parentWin = window.parent ;
             _parentWin.form1.username.value = "xxxx" ;
         }
         
         function childInvokeParent()
         {
         		var parentVairous = window.parent.window.parentVairous;
         		alert(parentVairous);	
         }
       </script>
    </head>
<body>
     <form name="form1" id="form1">
         <p>  </p>
         <p align="center">
            <input type = "button" 
                   name = "button" 
                   id = "button" 
                   value = "更新主页面的UserName内容" 
                   onclick = "UpdateParent()">
            <input type = "button"
            			 name = "button2"
            			 id = "button2"
            			 value = "测试IFrame子窗口调用父窗口的全局变量"
            			 onclick = "childInvokeParent();"/>
         </p>
         <p>  </p>
     </form>
</body>
</html>

ps:不能跨域获取,例如iframe的src是'http://www.xxx.ccc/'就不可以

2:   window.opener 是window.open 打开的子页面调用父页面对象
实例地址:  http://www.cnspry.cn/blog/attachments/window.opener 实例/a.html

源码:
2.a.html

<html>
<head>
     <title>主页面</title>
     <script type="text/javascript">
     /*为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量 */  
     var parentVairous = "为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量"; 
     
     /* 
      *  因为不同于IFrame(IFrame有id,window.open()与IFrame的父子窗口的模式不同),
      *  所以当是通过window.open()方法打开一个新窗口使, 必须有一个新窗口的对象 
      *  当然必须先让子窗口弹出来, 才能调用子窗口中的变量, 否则抛出异常
      */
     var OpenWindow;
     
     function openSubWin()
     {
         OpenWindow = window.open('b.html', 'newwindow', 'height=1024, width=1300, top=0, left=0, toolbar=no, menubar=yes, scrollbars=yes,resizable=yes,location=no, status=no');
     }
     function parentInvokeChild()  
     {  
         if(OpenWindow)//当然必须先让子窗口弹出来, 才能调用子窗口中的变量, 否则抛出异常         
         {
               alert(OpenWindow.iFrameVair);
         }
     } 
     </script>
</head>
<body>
    <form name="form1" id="form1">
        <input type="text" name="username" id="username"/>
        <input type="button" value="弹出子页面" onclick = "openSubWin()">
        <input type="button" value="测试调用弹出窗口中的全局变量" onclick = "parentInvokeChild()">
    </form>
</body>
</html>

2.b.html 代码

<html>
    <head>
        <title>子页面</title>
        <script type="text/javascript">
         /** 为测试父窗体调用IFrame子窗体的全局函数而添加的子窗口全局函数 */  
         var iFrameVair = "测试父窗体调用IFrame子窗体的全局函数";
         function UpdateParent()
         {
              var _parentWin = window.opener;
              _parentWin.form1.username.value = "xxxx" ;
         }
         function childInvokeParent()  
         {  
              var parentVairous = window.opener.window.parentVairous;  
              alert(parentVairous);     
         }
        </script>
    </head>
<body>
<form name="form1" id="form1">
<p>  </p>
<p align="center">
    <input type="button" 
               onclick = "UpdateParent();" 
               name="button" 
               id="button" 
               value="更新主页面的UserName内容">
    <input type = "button"  
           name = "button2"  
           id = "button2"  
           value = "测试IFrame子窗口调用父窗口的全局变量"  
           onclick = "childInvokeParent();"/>  
</p>
<p>  </p>
</form>
</body>


最后是关于模态窗口
window.open的写法:
OpenWindow = window.open('b.html', 'newwindow', 'height=1024, width=1300, top=0, left=0, toolbar=no, menubar=yes, scrollbars=yes,resizable=yes,location=no, status=no');

模态窗口的写法:
OpenWindow = window.showModalDialog("b.html",'newwindow',"dialogHeight:100px,center:yes,resizable:no,status:no");

模态窗口调用父窗口也是window.parent来处理的,而window.open是通过opener对象来调用父窗口的成员变量。但是模态和window.open有个功能上的区别就是,模态的窗口不能刷新父页面(刷新整个页面,比如用window.location或form.submit等的处理),而使用window.open就可以进行刷新父窗口的操作


补充知识:
父窗口关闭,再关闭子窗口,不报错代码,添加到关闭子窗口的事件方法上的代码
if(window.opener.closed){
   window.close();
   return;
}


或者:
try{
  //需要捕获异常的代码块......
}catch(e){
  window.close();
}
分享到:
评论

相关推荐

    iframe父页面与子页面通信及相互调用方法

    "iframe父页面与子页面通信及相互调用方法"是一个重要的主题,涉及到跨域安全、DOM操作以及JavaScript/jQuery的交互技术。下面将详细解释这一知识点。 1. **基本概念** - **父页面(Parent Page)**:包含`iframe`...

    子窗口刷新父窗口总结

    通过在子窗口中调用`window.opener.location.reload()`,可以实现在子窗口关闭时刷新父窗口。具体实现如下: ```javascript // 子窗口代码 window.close(); if (条件满足) { window.opener.location.reload(); } `...

    JavaScript中的子窗口与父窗口的互相调用问题

    首先,想要实现子窗口与父窗口之间的互相调用,关键是获取到对方窗口的引用。在JavaScript中,当子窗口打开时,通过window.open()方法创建的新窗口实例会被存储在一个变量中,该变量引用子窗口对象,反之亦然。父...

    frame之间以及子页面和父页面间参数传递

    在提供的示例代码中,父页面和子页面分别使用了简单的JavaScript函数实现了相互之间的元素访问。这种直接访问DOM元素的方法简单直接,适合在同源策略允许的情况下使用。 - **父页面**: ```html 获取子页面文本" ...

    layer弹出层父子页面事件相互调用方法

    为了实现数据的传递,可以通过在父页面中设置iframe的src属性,并在子页面中使用JavaScript获取父页面传递的参数,同时也可以在子页面中操作父页面的DOM元素或调用父页面的方法。 在上述提供的代码片段中,父页面...

    ActionScript与JavaScript相互调用

    要实现ActionScript与JavaScript之间的相互调用,需要了解两种语言的交互机制。 - **在Flash中调用JavaScript**:通过`getURL()`函数实现。`getURL()`函数主要用于创建超级链接,但也可以用来调用JavaScript函数。...

    iframe父与子、子与子之间控制以及js相互调用实际例

    iframe通常用于显示广告、嵌入视频、地图等,或者用于实现页面部分的动态更新,比如通过JavaScript动态加载内容。 **iframe的父子、子与子之间的交互** 在Web开发中,有时我们需要在iframe中嵌入的页面与主页面,...

    浅谈js中子页面父页面方法 变量相互调用

    在JavaScript开发中,特别是在涉及到iframe嵌套页面的情况下,经常需要在子页面和父页面之间进行方法和变量的相互调用。在Web开发的场景中,子页面指的是嵌入到父页面中的iframe页面。由于它们处于不同的浏览上下文...

    子窗口、父窗口和Silverlight之间的相互调用

    总结一下,子窗口、父窗口和Silverlight之间的相互调用是通过JavaScript和Silverlight的互操作性实现的。这种机制允许Web应用程序构建更复杂、更动态的用户界面,提高用户体验。了解并熟练掌握这些技巧对于任何Web...

    iframe与父页面传值(方法互调)

    本篇文章将深入探讨如何在`iframe`与父页面之间进行值的传递以及方法的互相调用。 首先,我们可以通过JavaScript的DOM(Document Object Model)接口来实现`iframe`与父页面之间的通信。在`iframe`内的页面,我们...

    关于Iframe父页面与子页面之间的相互调用

    本文将详细探讨如何实现Iframe父页面与子页面之间的相互调用。 首先,理解window对象是关键。在浏览器中,每一个HTML文档都有一个与之关联的window对象,它是全局JavaScript对象,包含了浏览器窗口的所有功能。在...

    用js互相调用iframe页面内的js函数

    在这个场景下,涉及到的一个常见需求就是如何用JavaScript在主页面与`iframe`页面之间互相调用函数,以便于进行更复杂的交互。 标题提到的问题是在各种浏览器中,尤其是考虑到跨浏览器兼容性时,如何用JS实现主页面...

    js中子页面获取父页面ID

    本文详细介绍了如何在JavaScript中实现子页面调用父页面ID并对父页面进行操作的方法。主要涵盖了使用`window.parent`和`frames`对象的基本概念及示例代码。此外,还提到了跨域访问限制以及可能的解决方案。希望这些...

    iframe 父窗口和子窗口相互的调用方法集锦

    下面详细介绍如何在不同浏览器环境下实现父窗口和子窗口之间的相互调用。 ### 一、基本调用方法 #### 1. 父窗口调用子窗口 在HTML中,我们首先为`iframe`定义一个`name`属性,如`...

    javascript页面之间传值

    本实例将探讨如何在父窗口与子窗口之间有效地传递数据,以及两种实现这一目标的方法。 第一种方法是通过`window.open()`函数创建子窗口,并利用`window.opener`属性在父窗口和子窗口之间传递值。`window.open()`...

    JS父页面与子页面相互传值方法

    在多页面应用或者嵌入式框架(如iframe)中,经常需要进行父页面与子页面之间的数据交换。下面将详细介绍如何在不同场景下使用JS实现这种传值。 一、子页面是父页面通过`window.open`弹出的情况 当子页面是通过`...

    父子页面数据相互传递

    数据在父子页面间的传递,可以帮助我们实现更复杂的交互逻辑,如在子页面完成某些操作后,将结果反馈给父页面,或者在父页面中设置初始数据,供子页面使用。 常见的数据传递方法有以下几种: 1. URL参数传递:通过...

    iframe兄弟页面相互调用

    本文将详细讲解如何实现`iframe`兄弟页面之间的相互调用。 首先,理解`iframe`的结构是关键。一个`iframe`元素在HTML中通过`&lt;iframe src="..." &gt;&lt;/iframe&gt;`定义,`src`属性指定了要加载的页面URL。多个`iframe`在...

    在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法

    本文将详细介绍如何在Layui的表格模板中,实现layer父页面与子页面之间的数据交互。 首先,我们需要理解Layui的table组件。在示例中,表格`#role_tb`是通过Layui的`table`模块动态渲染的,它从服务器获取数据并显示...

Global site tag (gtag.js) - Google Analytics