window.open子窗口给父窗口传值

一、子页面是父页面通过window.open弹出的情况

子页面要向父页面传值,只要在document前面加window.opener即可。

定义和用法

open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口。

语法

1
window.open(URL,name,features,replace)
参数描述
URL一个可选的字符串,声明了要在新窗口中显示的文档的 URL。如果省略了这个参数,或者它的值是空字符串,那么新窗口就不会显示任何文档。
name一个可选的字符串,该字符串是一个由逗号分隔的特征列表,其中包括数字、字母和下划线,该字符声明了新窗口的名称。这个名称可以用作标记
的属性 target 的值。如果该参数指定了一个已经存在的窗口,那么 open() 方法就不再创建一个新窗口,而只是返回对指定窗口的引用。在这种情况下,features 将被忽略。
features一个可选的字符串,声明了新窗口要显示的标准浏览器的特征。如果省略该参数,新窗口将具有所有标准特征。在窗口特征这个表格中,我们对该字符串的格式进行了详细的说明。
replace一个可选的布尔值。规定了装载到窗口的 URL 是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目。支持下面的值:true - URL 替换浏览历史中的当前条目。false - URL 在浏览历史中创建新的条目。

eg:

1
window.open('url', 'name', 'height=500, width=600, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no')

子页面传值给父页面

1
2
3
4
5
if(window.opener){//判断是否有父窗口,即打开本页面的窗口
// window.opener.location.reload();//刷新父窗口 window.opener.document.getElementById("j-aaa").innerHTML="newValue"; //id为父页面dom id
//window.opener.close(); //关闭父窗口
window.close(); //关闭子窗口
}

二、子页面是iframe框架中的页面情况

子页面要向父页面传值,只要在document前面加parent即可。
iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同。

  • 父页面parent.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <html>
    <head>
    <script type="text/javascript">
    function say(){
    alert("parent.html");
    }
    function callChild(){
    myFrame.window.say();
    myFrame.window.document.getElementById("button").value="调用结束";
    }
    </script>
    </head>
    <body>
    <input id="button" type="button" value="调用child.html中的函数say()" onclick="callChild()"/>
    <iframe name="myFrame" src="child.html"></iframe>
    </body>
    </html>
  • 子页面child.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <html>
    <head>
    <script type="text/javascript">
    function say(){
    alert("child.html");
    }
    function callParent(){
    parent.say();
    parent.window.document.getElementById("button").value="调用结束";
    }
    </script>
    </head>
    <body>
    <input id="button" type="button" value="调用parent.html中的say()函数" onclick="callParent()"/>
    </body>
    </html>

方法调用

父页面调用子页面方法:FrameName.window.childMethod();

子页面调用父页面方法:parent.window.parentMethod();

DOM元素访问

获取到页面的window.document对象后,即可访问DOM元素
要确保在iframe加载完成后再进行操作,如果iframe还未加载完成就开始调用里面的方法或变量,会产生错误。判断iframe是否加载完成有两种方法:

  1. iframe上用onload事件

  2. 用document.readyState==”complete”来判断

二、跨域父子页面通信方法

如果iframe所链接的是外部页面,因为安全机制就不能使用同域名下的通信方式了。

父页面向子页面传递数据

实现的技巧是利用location对象的hash值,通过它传递通信数据。在父页面设置iframe的src后面多加个data字符串,然后在子页面中通过某种方式能即时的获取到这儿的data就可以了,例如:

  1. 在子页面中通过setInterval方法设置定时器,监听location.href的变化即可获得上面的data信息

  2. 然后子页面根据这个data信息进行相应的逻辑处理

子页面向父页面传递数据

实现技巧就是利用一个代理iframe,它嵌入到子页面中,并且和父页面必须保持是同域,然后通过它充分利用上面第一种通信方式的实现原理就把子页面的数据传递给代理iframe,然后由于代理的iframe和主页面是同域的,所以主页面就可以利用同域的方式获取到这些数据。使用 window.top或者window.parent.parent获取浏览器最顶层window对象的引用。

坚持原创技术分享,您的支持将鼓励我继续创作!