子窗体关闭触发父窗体事件
功能:在父窗体用window.open打开一个子窗体,选择一个产品后,写入父窗体同时用ajax查该产品对应的其他信息
http://homepage.yesky.com/489/2370989.shtml
基本介绍:
showModalDialog() (IE 4+ 支持)
showModelessDialog() (IE 5+ 支持)
window.showModalDialog() 方法用来创建一个显示HTML内容的模态对话框。
window.showModelessDialog() 方法用来创建一个显示HTML内容的非模态对话框。
使用方法:
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])
参数说明:
sURL -- 必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
vArguments -- 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
sFeatures -- 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
----------------
1. dialogHeight: 对话框高度,不小于100px
2. dialogWidth: 对话框宽度。
3. dialogLeft: 离屏幕左的距离。
4. dialogTop: 离屏幕上的距离。
5. center: { yes | no | 1 | 0 } : 是否居中,默认yes,但仍可以指定高度和宽度。
6. help: {yes | no | 1 | 0 }: 是否显示帮助按钮,默认yes。
7. resizable: {yes | no | 1 | 0 } [IE5+]: 是否可被改变大小。默认no。
8. status: {yes | no | 1 | 0 } [IE5+]: 是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9. scroll: { yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。
下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10. dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11. edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12. unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。
参数传递:
1. 要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:
-------------------------------
parent.htm
<script>
var obj = new Object();
obj.name="51js";
window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");
</script>
modal.htm
<script>
var obj = window.dialogArguments
alert("您传递的参数为:" + obj.name)
</script>
-------------------------------
2. 可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:
------------------------------
parent.htm
<script>
str =window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");
alert(str);
</script>
modal.htm
<script>
window.returnValue=" http://homepage.yesky.com";
</script>
*****************************************************************************
父窗口关闭时,自动关闭已打开的子窗体(父窗体控制子窗体)
通过Javascript可以控制父窗体操作子的iframe窗体,也可以操作从父窗体使用window.open方式打开的子窗体。
今天一位在北京工作的朋友问到我如何在关闭父窗体时自动关闭已打开的子窗体。我首先问了她一下需求。问是不是广告之类。看了后觉得不是,类似于小窗体显示详细信息。
这种情况我首先想到二种方法,
第一种方式:可以使用模态窗口方式打开子窗体,这样用户在关闭子窗体前是无法操作父窗体的。包括关闭父窗体的操作!
第二种方式:使用WEB2.0的方式,DIV层,类似于很多网现在的登录方式。点击后出现一个遮罩层,然后主DIV显示登录窗体。这样用户也在关闭“子页面”时无法操作“父窗体”。可以关闭父窗体,此时当然,登录的DIV“窗体”也随之关闭!
遇到问题,通过在一眼不知如何解答时,我首先会换一种思维方式~显然这上面二种情况都基本可以解决这个问题!
后来看了 一下他们公司的网站,发现页面上打开链接的方式是使用window.open的方式。如果使用a href的方式打开的话。我想是不大容易实现父窗体关闭,子窗体也随之关闭。但既然是使用window.open脚本的方式。实现起来并不难!
如下:
<! 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 >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" />
< title > 打开指定URL的窗口/改变链接时候状态栏的文字 </ title >
< script language ="javascript" >
//申明一个代表窗体对象的变量,这是关键,他作为全局变量,后面两个函数都可以访问他
var SunWindows;
function newWindow(url)
{//这里申明一个根据传来的地址打开新窗口的函数
SunWindows=window.open(url,"","width=400,height=300,left=200,top=200");//将打开的窗口对象作为值赋给SunWindows对象
}
function closeWind()
{
//关闭打开的新窗口,否则提示
if(SunWindows)//如果SunWindows对象存在
{
SunWindows.close();//调用关闭方法
SunWindows=null//并把值赋成null
}
else
{
//alert("没有打开的窗口");
}
}
</ script >
</ head >
< body onunload ="closeWind();" >
< p >
< input type ="submit" name ="tijiao" value ="打开fengyan博客" onclick ="newWindow('http://eflylab.cnblogs.com')" />
打开博客后,关闭本窗体。打开的子窗体会自动关闭
</ p >
< p >
< input type ="submit" name ="close" value ="直接在本窗体中关闭刚才打开的窗口" onclick ="closeWind()" />
</ p >
< p >< a href ="http://eflylab.cnblogs.com" > http://eflylab.cnblogs.com </ p >
</ body >
</ html >
主要实现方式是 利用了 window.open()方法的返回值。一般情况下很少有人会利用这个值~直接执行打开就完了,而,我们可以定义一个JS的全局变量SunWindows将window.open的返回值赋给它,这样它“代表”了当前打开的子窗体。然后我们可以直接调用 SunWindows.Close();方法就可以关闭打开的子窗体!因为要使用父窗体关闭时,自动关闭子窗体。所以我将该方法的执行放在了 Body的onUnload()事件中~当页面要离开时执行~这样可以满足朋友的项目需求~
注:由IE父窗体A中,点击一个链接,打开一个新的窗口B,然后当用户关闭了父窗口A时需求是要将已打开的“子窗口”B也关闭掉。你说到的浏览器不存在这样的问题~一关闭就本身就全部关闭了
待解决:
比如一个主窗体,开了一个子窗体,然后子窗体又开了孙窗体,就是有多个父子关系的窗体的话,该方法的全局变量就不适用了,如何能做到关一个主窗体,所有由该主窗体打开的窗体(包括子窗体和孙窗体)全部关闭?
***************************************************************************