原文地址
Onunload与Onbeforeunload
<script type="text/javascript"> <!-- window.onbeforeunload = onbeforeunload_handler; window.onunload = onunload_handler; function onbeforeunload_handler(){ var warning="确认退出?"; return warning; } function onunload_handler(){ var warning="谢谢光临"; alert(warning); } // --> </script>
如果需使用window.location指定URL进行处理,那么需放在onBeforeUnload 事件中而不是onUnload事件。在onUnload里不要使用window.close,因为对象销毁前会立即触发该事件,无法有效执行由被销毁对象所引发的引用。而onBeforeUnload是页面将要被卸载前触发的事件。解决的方法是新开一个窗口再将之关闭。而所谓的清除实质上就是把做好退出功能的页面,直接以打开新窗口方式的调用。在调用到关闭的时候要尽可能停留一段时间确保全部代码被有效触发。需要说明的是onUnload事件,在页面前进、后退、刷新、转向、关闭后都会触发。因此要捕获强制关闭窗口的特殊事件,需要在代码上加上判断条件,以保证在符合情形的条件下触发。该段代码已经成功地进行测试。
对话框取值
在网页中,经常会使用一种类似对话框的设计,为了方便用户输入、快速选择经常会打开一个页面,再做出选择后关闭该页面并将用户选择的数据传递到父页面做后续处理。
前些时间,看到一种比较原始的方法,不是很通用,直接在子页面里修改父页面某个控件的数值再加之关闭。这样做的缺点是,不适合大规模的调用。假设父页面有开始日期与结束日期两个框需要接受日历页面的输入,那么你需要做两个不同的日历页面才能保证两个框都有对应的数据。这在大型工程中是不好的设计方法。多样化的外部环境,如果不考虑通用的方法,将增加维护的难度同时降低开发的效率。
IE支持模态窗口,在对话框的页面中通过设置的window.returnValue的数值,在父窗体中靠调用window.showModalDialog获取返回值,无效将返回null(打开的页面不存在)或undefined(window.returnValue没有设置)。我设计了getDialog函数,用于获取子窗体的返回值,异常或者无效将返回空串否则为正常返回数据。
而原先的window.open方式,我也改进一下设计了getWindowReturnValue,通过侦听子窗体的window.returnValue,如果有数据将开始终止。如果窗体仍然打开则自动关闭。同样两个函数都需要进行正确的设置window.returnValue。
//在IE中打开模态对话框并返回数据
//需要在打开页面设置window.returnValue,错误或无效返回空
function getDialog(url)
{
var returnValue;
try
{
returnValue=window.showModalDialog(url);
}catch(e)
{ return ""; }
return (returnValue==null||returnValue=="undefined")?"":returnValue;
}
//使用window.open来获取子窗口数据,需要动态设置window.returnValue
//参数为:地址、名称、宽度、高度,不设置宽度与高度请设为0。
function getWindowReturnValue(url,name,width,height)
{
var opener=null;
var spec="toolbar=0,menubar=0,scrollbars=0,resizeable=0";
var returnValue=null;
if(width>0) spec=spec+",width="+String.valueOf(width);
if(height>0)
{
spec=spec+",height="+String.valueOf(height);
}
opener=window.open(url,name,spec);
while(!opener.window.closed)
{
returnValue=opener.window.returnValue;
if(returnValue!=null&&returnValue.length>0) break;
}
if(!opener.window.closed) opener.window.close();
return returnValue;
}