记录我工作学习生活中的点点滴滴......

javascript 子窗口中操作父窗口中的对像
发布于 Javascript
2013-01-22 11:03:02
7415
0

在ModalDialog中操作父窗口对象

不能使用window.parent

Window.parent是用来在frame中进行操作的,在对话框中不能用来操作父窗口对象

正确的做法

调用modaldialog时通过传参数的方式操作

例1:

需求

  • 父窗口页面为 a.html 子窗口页面为b.html
  • a.html 中有文本框id为 test1
  • 在打开的对话框中点击按钮,将a.html的文本框值改为“子窗口值”。

实现

  • 打开对话框时把test1作为参数传给子窗口
  • 在子窗口中获取参数
  • 将参数对象(即a.html中传过来的text对象)的value属性值设置为“子窗口值”

注意:这里只能传id,不能传name

a.html代码如下:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>a.html</title>
</head> 
<body> 
<input type="text" id="test1" value="" /> 
<input type="button" value=" OK " onclick="window.showModalDialog('b.html', test1)"> 
</body> 
</html>

b.html代码如下:


<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>b.html</title> 
<script language="javascript"> 
	function func1() { 
		//获取父窗口传过来的参数 
		var ptextid = window.dialogArguments; 
		if(ptextid != undefined) { 
		//将父窗口传过来的对象的值改为“子窗口值” 
				ptextid.value = "子窗口值"; 
				//关闭子窗口 
		window.close(); 
		} 
	} 
</script> 
</head> 
<body> 
<input type=button value=" OK " onclick=func1()> 
</body> 
</html>


如果需要操作的父窗口对象比较多,也可以将windowwindow.document作为参数传给子窗口。

例2:

需求

  • a.html中添加id为“aform”的的form,form中有id为“test2”的文本框
  • 在b.html中,除了进行上面的操作之外,还要将test2的值改为“子窗口值2”
  • 并将form提交到c.html。

实现1

将a.html中打开对话框的函数改为如下方式:

window.showModalDialog("b.html", window.document);

将b.html中func1()改为如下:

function func1() { var pdoc = window.dialogArguments; if(pdoc != undefined) { pdoc.all.test1.value = "子窗口值"; pdoc.all.test2.value = "子窗口值2"; pdoc.all.aform.action = "c.html"; pdoc.all.aform.submit(); } }

实现2

因为在子窗口中对父窗口进行的操作比较多,也可以采用execScript的方式实现。

将a.html中打开对话框的函数改为如下方式:

window.showModalDialog("b.html", window);

添加javascript函数如下:

function func() { test1.value = "子窗口值"; document.all.test2.value = "子窗口值2"; aform.action="c.html"; aform.submit(); }

将b.html中func1()改为如下:

function func1() { var pwin = window.dialogArguments; if(pwin!=undefined) { var codeStr = "func();" pwin.execScript(codeStr, "javascript"); window.close(); } }

showModalDialog和showModelessDialog使用心得

一、showModalDialog和showModelessDialog有什么不同?

  • showModalDialog:被打开后就会始终保持输入焦点。除非对话框被关闭,否则用户无法切换到主窗口。类似alert的运行效果。
  • showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。:P)

二、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?

在被打开的网页里加上就可以了。这句话一般是放在和之间的。

三、怎样才刷新showModalDialog和showModelessDialog里的内容?

在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠javascript了,以下是相关代码:

reload...

将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要配合使用,不然你按下F5会弹出新窗口的。

四、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。


也要配合,不然会打开一个新的IE窗口,然后再关掉的。

五、showModalDialog和showModelessDialog数据传递技巧。

(作者语:本来想用一问一答形式来写的,但是我想不出这个怎么问,所以只好这样了。)
这个东西比较麻烦,我改了好几次了不是没办法说明白(语文水平越来越差了),只好用个例子说明了。
例子:
现在需要在一个showModalDialog(或showModelessDialog)里读取或设置一个变量var_name

一般的传递方式:

window.showModalDialog("filename.htm", var_name);    //传递var_name变量

在showModalDialog(或showModelessDialog)读取和设置时:

alert(window.dialogArguments); //读取var_name变量 window.dialogArguments = "oyiboy"; //设置var_name变量

这种方式是可以满足的,但是当你想在操作var_name同时再操作第二个变理var_id时呢?就无法再进行操作了。这就是这种传递方式的局限性。

以下是我建议使用的传递方式:

window.showModalDialog("filename.htm", window);    //不管要操作什么变量,只直传递主窗口的window对象

在showModalDialog(或showModelessDialog)读取和设置时:

alert(window.dialogArguments.var_name);    //读取var_name变量 window.dialogArguments.var_name = "oyiboy";    //设置var_name变量

同时我也可以操作var_id变量:

alert(window.dialogArguments.var_id); //读取var_id变量 window.dialogArguments.var_id = "001"; //设置var_id变量

同样还可以对主窗口的任何对象进行操作,如form对象里的元素。

window.dialogArguments.form1.index1.value = "这是在设置index1元素的值";

六、多个showModelessDialog的相互操作。

因为光说很费劲,我就偷点懒,直接用代码来说了,如果不明白的话那就直接回复问我吧

以下代码的主要作用是在一个showModelessDialog里移动别一个showModelessDialog的位置。

主文件的部份js代码。

var s1 = showModelessDialog('控制.htm', window, "dialogTop:1px; dialogLeft:1px"); //打开控制窗口 var s2 = showModelessDialog('about:blank', window, "dialogTop:200px; dialogLeft:300px") //打开被控制窗口

控制.htm的部份代码。


以上关键部份是:

  • 窗口命名方式:var s1 = showModelessDialog(‘控制.htm’,window, “dialogTop:1px; dialogLeft:1px”)
  • 变量访问方式:window.dialogArguments.s2.dialogTop

这个例子只是现实showModelessDialogshowModelessDialog之间的位置操作功能,通过这个原理,在showModelessDialog之间相互控制各自的显示页面,传递变量和数据等。这要看各位的发挥了。

window.dialogArguments的用法

Javascript有许多内建的方法来产生对话框,如:

  • window.alert
  • window.confirm
  • window.prompt

然而IE提供更多的方法支持对话框。如:

  • showModalDialog  (IE  4+  支持)
    window.showModalDialog方法用来创建一个显示HTML内容的模态对话框,由于是对话框,因此它并没有一般用window.open打开的窗口的所有属性。
  • showModelessDialog  (IE  5+  支持)
  • window.showModelessDialog方法用来创建一个显示HTML内容的非模态对话框。

当我们用showModelessDialog打开窗口时,不必用window.close()去关闭它,当以非模态方式[IE5]打开时,  打开对话框的窗口仍可以进行其他的操作,即对话框不总是最上面的焦点,当打开它的窗口URL改变时,它自动关闭。而模态[IE4]方式的对话框始终有焦点(焦点不可移走,直到它关闭)。模态对话框和打开它的窗口相联系,因此我们打开另外的窗口时,他们的链接关系依然保存,并且隐藏在活动窗口的下面。

使用方法如下:

vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures]) vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])

参数说明:

  • sURL: 必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
  • vArguments: 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
  • sFeatures: 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
  • dialogHeight: 对话框高度,不小于100px,IE4中 dialogHeightdialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
  • dialogWidth: 对话框宽度。
  • dialogLeft: 距离桌面左的距离。
  • dialogTop: 离桌面上的距离。
  • center: {yes  |  no  |  1  |  0  }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
  • help: {yes  |  no  |  1  |  0  }:是否显示帮助按钮,默认yes。
  • resizable: {yes  |  no  |  1  |  0  }  [IE5+]:是否可被改变大小。默认no。
  • status: {yes  |  no  |  1  |  0  }  [IE5+]:是否显示状态栏。默认为yes[  Modeless]或no[Modal]。
  • scroll: {  yes  |  no  |  1  |  0  |  on  |  off  }:指明对话框是否显示滚动条。默认为yes。

还有几个属性是用在HTA中的,在一般的网页中一般不使用:

  • dialogHide: {  yes  |  no  |  1  |  0  |  on  |  off  }:在打印或者打印预览时对话框是否隐藏。默认为no。
  • edge: {  sunken  |  raised  }:指明对话框的边框样式。默认为raised。
  • unadorned: {  yes  |  no  |  1  |  0  |  on  |  off  }:默认为no。

传入参数:

要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:

test1.htm
====================

var mxh1 = new Array("mxh", "net_lover", "孟子E章"); var mxh2 = window.open("about:blank", "window_mxh"); // 向对话框传递数组 window.showModalDialog("test2.htm", mxh1); // 向对话框传递window对象 window.showModalDialog("test3.htm", mxh2);

test2.htm
====================

var a = window.dialogArguments; alert("您传递的参数为:"  +  a)

test3.htm
====================

var a = window.dialogArguments; alert("您传递的参数为window对象,名称:" + a.name);

可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:

test4.htm
===================

var a = window.showModalDialog("test5.htm"); for(i = 0; i < a.length; i++) alert(a[i]);

test5.htm
===================


常见问题:

1,如何在模态对话框中进行提交而不新开窗口?
如果你的 浏览器是IE5.5+,可以在对话框中使用带name属性的iframe,提交时可以制定target为该iframe的name。对于IE4+,你可以用高度为0的frame来作。例子:

test6.htm
===================

window.showModalDialog("test7.htm");

test7.htm
===================


test8.htm
===================




分享本文到:
除非特殊注明,本文版权归原作者所有,欢迎转载!转载请注明版权以及本文地址,谢谢。
转载保留版权:Pakey's BLog >>Javascript >>javascript 子窗口中操作父窗口中的对像
本文地址:http://www.pakey.net/blog/javascript-son-operate-parent.html