• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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打开新窗口被拦截的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    您可能感兴趣的文章:
    • Ajax请求成功后打开新窗口地址
    • ajax怎么打开新窗口具体如何实现
    • Ajax打开新窗口被浏览器拦截的两种解决办法
    上一篇:Ajax请求成功后打开新窗口地址
    下一篇:利用AJAX实现无刷新数据分页
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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