Ajax请求响应中用window.open打开新窗口被拦截的解决方法

 更新时间:2016年08月04日 11:44:30   作者:51kata  
ajax 异步请求成功后需要新开窗口打开 url,使用的是 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打开新窗口被拦截的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • ajax 返回值自动添加pre标签的解决方法

    ajax 返回值自动添加pre标签的解决方法

    ajax返回的内容,居然自动添加了pre标签,解决方法是修改一般处理程序的返回类型,遇到类似情况的可以参考下
    2014-07-07
  • 防止ajax重复请求的方法(GET和POST)

    防止ajax重复请求的方法(GET和POST)

    防止ajax重复请求的方法(GET和POST) ,需要的朋友可以参考下。
    2011-10-10
  • 谈谈Ajax原理实现过程

    谈谈Ajax原理实现过程

    Asynchronous javascript and xml(ajax),实现了客户端与服务器进行数据交流过程。使用技术的好处是:不用页面刷新,并且在等待页面传输数据的同时可以进行其他操作
    2015-11-11
  • Spring MVC前端与后端5种ajax交互方法【总结】

    Spring MVC前端与后端5种ajax交互方法【总结】

    下面小编就为大家带来一篇Spring MVC前端与后端5种ajax交互方法【总结】。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 使用AJAX(包含正则表达式)验证用户登录的步骤

    使用AJAX(包含正则表达式)验证用户登录的步骤

    这篇文章主要介绍了使用AJAX(包含正则表达式)验证用户登录的步骤,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 经典的20道AJAX面试题(必知必会)

    经典的20道AJAX面试题(必知必会)

    本文给大家介绍20道jquery ajax面试题,在前端开发阶段经常会问到,今天小编给大家分享经典的20道AJAX面试题,感兴趣的朋友一起学习吧
    2016-09-09
  • JavaScript实现Ajax总结

    JavaScript实现Ajax总结

    ajax应用非常普及,ajax的优点大家都知道,具体就不多说了,其缺点还真不少,比如破坏浏览器的back功能,同一个url打开的界面并不是完全相同,还有安全性能等方面,至于有这么多的缺点,也阻止不了大家使用ajax的步伐,下文给大家分享javascript实现ajax小结吧
    2015-10-10
  • JQuery的ajax的用法在asp中使用$.ajax()实现

    JQuery的ajax的用法在asp中使用$.ajax()实现

    ajax的出现解决了很多的疑难问题,同时带来了很多的方便,本文讲述一下JQuery的ajax的用法在asp中使用$.ajax()来表示,感兴趣的朋友可以了解下,或许本文对你有所帮助
    2013-01-01
  • Ajax方式实现定期更新页面某块内容的方法

    Ajax方式实现定期更新页面某块内容的方法

    这篇文章主要介绍了Ajax方式实现定期更新页面某块内容的方法,涉及jquery中load方法Ajax调用及setInterval定时执行的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 使用ajax技术无刷新动态调用新浪股票实时数据

    使用ajax技术无刷新动态调用新浪股票实时数据

    由于最近网速慢的缘故,查看股票信息时网页老是打不开。这几天一直在研究ajax,于是用jquery自己做了一个自动读取新浪股票实时数据的页面
    2014-08-08

最新评论