异步完成后新开窗口
作者:zhusun 时间:2010-04-06 12:37:00
在最近一次项目有一个需求,点击按钮——异步提交——异步响应返回——根据响应返回值新开窗口。这有两个要点:
异步响应之前不知道要打开窗口的URL;
在异步响应事件函数中再去打开新窗口——winodw.open(url)时,一些浏览器会拦截新窗口;
第一个约束条件没有突破口,而第二个问题如果仅仅是指让浏览器不拦截JS的新开窗口也比较好处理,这里可以借鉴提交target属性为“_blank”的form表单(对应的blog)或者淘宝怿飞的一篇博客。
但怿飞的blog中有一点很重要——用户点击页面。即使我用了下面一段代码来模拟点击事件也是不行的。var linkDom = document.getElementById('Alink');
if (document.all){
linkDom.fireEvent('onclick');
}else{
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click", true, true);
linkDom.dispatchEvent(evt);
}
我在异步回调函数中已经将URL写入到了Alink元素的href上,上面的代码确实让Alink元素触发了click事件,但不会打开页面,因为浏览器会判断当用户主动点击页面的时候才是用户自己的行为,才去打开新开窗口。
最后由大米提供了一个方法:在用户触发异步事件的时候就打开一个空页面,当异步回调完成以后用新的URL来修改已打开页面location。window.newWin = window.open();
........
window.newWin.location = newURL;
这个方法也是在有限时间里提出的一种方案,感觉还有一些不足的地方,比如如果异步失败又要去关闭窗口,而浏览器又会询问是否关闭等问题。如果大家有什么好的思路请提点一下。