技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> JavaScript --> 异步完成后新开窗口

异步完成后新开窗口

浏览:2964次  出处信息

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

  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的同步,异步,阻塞,非阻塞    (阅读:14552)
  2. fsockopen 异步处理    (阅读:9089)
  3. 配合jquery实现异步加载页面元素    (阅读:5388)
  4. 使用django+celery+RabbitMQ实现异步执行    (阅读:5078)
  5. 异步编程与响应式框架    (阅读:3957)
  6. 多核与异步并行    (阅读:3953)
  7. redis源代码分析 - event library    (阅读:3224)
  8. Google Analytics 异步代码详解    (阅读:3221)
  9. php的异步http请求类    (阅读:2968)
  10. Script 元素的异步加载属性    (阅读:2489)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1