IT技术博客大学习 共学习 共进步

异步完成后新开窗口

Koubei UED 2010-03-28 15:13:54 浏览 3,842 次

在最近一次项目有一个需求,点击按钮――异步提交――异步响应返回――根据响应返回值新开窗口。这有两个要点:

  1. 异步响应之前不知道要打开窗口的URL;
  2. 在异步响应事件函数中再去打开新窗口――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;

这个方法也是在有限时间里提出的一种方案,感觉还有一些不足的地方,比如如果异步失败又要去关闭窗口,而浏览器又会询问是否关闭等问题。如果大家有什么好的思路请提点一下。

建议继续学习

  1. 关于IO的同步,异步,阻塞,非阻塞 (阅读 16,424)
  2. fsockopen 异步处理 (阅读 10,203)
  3. 配合jquery实现异步加载页面元素 (阅读 6,284)
  4. 使用django+celery+RabbitMQ实现异步执行 (阅读 6,083)
  5. 多核与异步并行 (阅读 5,027)
  6. 异步编程与响应式框架 (阅读 4,884)
  7. Google Analytics 异步代码详解 (阅读 4,282)
  8. redis源代码分析 - event library (阅读 4,065)
  9. php的异步http请求类 (阅读 3,721)
  10. 基于OS信号实现Java异步通知 (阅读 3,443)