异步场景通过window.open打开新标签页被浏览器阻止

有这样一种场景,我们在打开一个资源的详细信息之前,需要对其进行一些校验,
如:由于客户端未及时刷新,而该资源实际已被删除,此时我们通过window.open试图在新标签页展示该资源详情,结果用户可能看到一个没有信息的页面。代码类似这样:

function goto(instanceId){
    event.preventDefault();
    $.ajax({
        ...options,
        url: "/rest/${instanceId}",
        success: function(res){
            if(res){
                window.open("/data/${instanceId}", "_blank");
            }
        },
        err: function(err){
            // handler err 
        }
    });
}

html是这样的

<a href="/data/${instanceId}" onclick="goto(${instanceId})">

但是问题来了,通过window.open方式会被ChromeFirefox阻止,如果不特别设置的话。
测试发现,如果没有这个异步的查询过程直接打开新标签页,问题就没有了。
有什么办法可以不更改需求的前提下完美解决该问题么?

阅读 3k
2 个回答

资源打开之前感觉没必要做校验,对于正常用户,验证接口相当于额外的开销,对于非法用户,就返回一个404,就比如segmentfault:

clipboard.png

//主流做法  先开一个空白页 再异步后在把地址改变
var win = window.open("", "_blank");
$http().then(function(res){
    win.location = res.open_url;
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题