ajax请求window.open()被拦截

项目使用ajax post后根据返回的success,需要打开一个新页面,使用window.open发现谷歌浏览器直接被拦截。

后来了解发现该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),

浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以也会被拦截。废话不多说,直接上终极解决办法

解决方法:

    var newwin = window.open(); // 这句必须在ajax之前定义
    $.ajax({
        type: 'POST',
        url: '/do.php',
        dataType: 'json',
        error: function(){
              newwin.close();
        },
        success: function(data){
              newwin.location = data.url;
        }
    });

也没首页会打开一个空白页面随后跳转到返回的url上,期间时间间隔很短。如果异步请求执行快几乎没有啥影响。

经测谷歌/360浏览器正常。
网上很多人说改成同步syns。。其实没实际卵用,它必须响应时间极短才能见效,不信大家可以试试,但是上面的代码在微信上行不通

微信不支持window.open ,至少我的安卓微信上是无法通过window.open打开窗口的,但是可以通过self.location.href='new.html'打开。
总结:上面通过window.open开始就打开空白页,体验不好,对于ajax 页面跳转打开新窗口确实没啥好的办法,还要兼顾微信和手机浏览器的兼容性问题:
最终我直接改成页面跳转,解决微信和其他浏览器的兼容问题:目前各浏览器和微信上一切正常:

$(document).ready(function () {
    $.post("/do.php", {
            order_sn: "111111"
            },
            function (data) {
                var data = eval("(" + data + ")");
                if(data.tatus==1)
            self.location.href = "";// 跳转到新页
            });
});

 

posted @ 2019-04-05 23:02  周伯通之草堂  阅读(2461)  评论(0编辑  收藏  举报