ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式
一、问题描述
ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下。
二、问题分析
浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截。
说明:
1、如果是在 <a href="javascript:void(0)" onclick="fun()"></a> 这个中指定的 fun方法中调用 window.open()则不会被拦截,因为浏览器会认为是主动的。 但是在ajax请求的响应中打开窗口是会被拦截的。
2、如果不是打开新窗口,而是改原来的网页地址,可以使用window.location = newurl 来实现,这样不会被拦截。
三、解决方案
在ajax请求之前,先用window.open 打开一个空白窗口,然后在ajax的响应函数中设置该窗口的location属性为新的url。
代码示例如:
function fun(){
var tmpWin =window.open()
ajax(xxx, handle(){
//回调函数。这是伪代码,语法不准。
var newurl = xxxx
tmpWin.location = newurl;
})
}
上面方法,存在一个问题时,因为先打开了空白窗口,如果ajax请求失败(网络或业务逻辑问题)后, 新窗口中就不会有正常的结果体现,有可能造成用户疑惑。
一个解决办法是,当ajax出现问题时,可以考虑给出一个提示,如 tmpWin.document.write("服务器处理异常");
甚至为了防止ajax响应时间过长,当窗口新建后,立即给出提示 tmpWin.document.write("服务器正在处理中,请稍后");
后面如果ajax正常返回,则因为设置了location值,原来打印的信息会被新的页面信息覆盖。
这里还有一种方法,但也有缺陷:
因为ajax可以设置为同步请求,这样可以在ajax请求之后,利用window.open打开新窗口。如:
function fun(){
var result;
ajax({ //需要设置同步请求
.....
result = xxx
.......
})
if(result){
window.open(xxxx)
}
}
上面的做法,因为是对ajax请求的结果判断后,才打开新窗口,避免了上面说的问题。
但是因为是同步请求,在我们测试中发现一个问题,如果服务器响应时间过长,一是界面会停顿(用户体验不好),二是新窗口会被拦截。
只有在服务器很快返回时才没有问题。 我们测试时,在服务器代码处理中sleep了1秒,发现新窗口就被拦截了。
四、小结
总结下,可以看出,对于在ajax返回后打开新窗口,没有特别完美的方法。具体还是要根据自己系统的业务特点来采取相应的做法。
ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式的更多相关文章
- 几个主流浏览器 Window.open打开新窗口 、模拟a标签打开新窗口的 表现
Window.open打开新窗口 1.常用浏览器打开新窗口(正常打开window.open)的的不同表现形式(PC/移动端) 2.Window.open在异步处理中打开(_blank) a标签在异步处 ...
- JS打开新窗口防止被浏览器阻止的方法
这篇文章主要介绍了JS打开新窗口防止被浏览器阻止的方法,分析对比了常用方法与改进方法,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了JS打开新窗口防止被浏览器阻止的方法.分享给大家供大家参考. ...
- JS打开新窗口防止被浏览器阻止的方法[转]
本文实例讲述了JS打开新窗口防止被浏览器阻止的方法.分享给大家供大家参考.具体分析如下: 用传统的window.open()方式打开新窗口,会被浏览器阻止,那么,我们如何才能让JS打开新窗口不被浏览器 ...
- 使用window.open打开新窗口被浏览器拦截的解决方案
问题描述: 代码中直接使用window.open('//www.baidu.com', '_blank');会被浏览器窗口拦截 原因浏览器为了维护用户安全和体验,在JS中直接使用window.open ...
- window.open 打开新窗口被拦截的解决方案
最近公司开发的一个项目,平凡用到下载各种类型的文件,但是例如.txt,.jpg,.pdf格式的文件呢浏览器会在当前窗口直接打开,影响用户体验,尝试各种方案和百度总结一下几点: 原理: 当window. ...
- window.open打开新窗口 参数
1,基本描述 oNewWindow = window.open( sURL , sName , sFeatures, bReplace) window.open在打开一个窗口(其url为sURL)后, ...
- window.open打开新窗口被浏览器拦截的处理方法
一般我们在打开页面的时候, 最常用的就是用<a>标签,如果是新窗口打开就价格target="_blank"属性就可以了, 如果只是刷新当前页面就用window.loca ...
- js 模拟window.open 打开新窗口
为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...
- window.open()打开新窗口教程
使用 window 对象的 open() 方法可以打开一个新窗口.用法如下: window.open (URL, name, features, replace) 参数列表如下: URL:可选字符串, ...
随机推荐
- elasearch 版本控制
http://192.168.32.81:9200/library/books/8/ GET { "_index": "library", "_typ ...
- Qt5 FOR WINCE7, Visual Studio 2008环境的搭建
Qt5 FOR WINCE7, Visual Studio 2008环境的搭建 Qt5发布时,试过配置Qt5 for wince的环境,原因是暂时不支持WINCE.前几天意外发现官方博客说明已经开始支 ...
- 介绍一个python的新的web framework——karloop框架
karloop是一款轻型的web framework,和tornado.webpy类似.mvc分层设计,眼下已经公布早期版本号了,使用方便, 下载地址例如以下:https://github.com/k ...
- Windows Server 2012 安装dll到GAC
使用Windows管理员打开PowerShell: 运行以下命令: Set-location "c:\tools\gac" [System.Reflection.Assembly] ...
- Angular JS 学习笔记(二)
1. AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面.AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定 ...
- 修改页面中所有TextBox控件的样式--CSS
1.HTML <div> TextBox<br /> <input type="text" name="name" value=& ...
- jQuery的fancybox插件
- C++对C语言的非面向对象特性扩充(2)
上一篇随笔写了关于C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较,也得到了几位学习C++朋友们的帮助讲解,十分感谢,我也希望欢迎有更多学习C++的朋友一起 ...
- 南阳师范学院ACM官方博客使用说明
登录之后跳到如下页面: 点击博客进入如下页面: 这里每个人都有一个专栏,大家可以把自己写得博客放到自己的专栏下,同时也可以查看其他人写的博客,相互交流! 在发表博客的时候,选择个人分类中自己的专栏即可 ...
- Android——用户登陆及用户名和密码的保存
Android——用户登陆及用户名和密码的保存 在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...