$.ajax().done()中的window.open和弹出窗口拦截器

window.open and pop-up blocker in $.ajax().done()

本文关键字:窗口 open done ajax 中的 window      更新时间:2023-09-26

我通过jQuery进行了ajax调用;当它完成时,我需要在一个新的选项卡中打开一个URL。

我写了一个简单的函数:

var openWin = function() {
    window.open('/UrlToOpen', '_blank');
    win.focus();
}

如果我直接从JS代码中调用这个函数,它会在不触发弹出窗口阻止程序的情况下打开。

如果我从$.ajax().done()调用它,就像这样:

$.ajax({
        url: 'ajaxUrl',
        type: 'POST'
    }).done(function (result) {
        openWin();
}); 

弹出窗口阻止程序被触发。

此处演示:https://jsfiddle.net/dggwL5uj/

为什么?我该如何避免这种情况?

如果将ajax请求更改为同步,这可能会起作用。

$.ajax({
        url: 'ajaxUrl',
        type: 'POST',
        async: false,
    }).done(function (result) {
        openWin();
}); 

如评论中所述,如果打开选项卡/弹出窗口的命令来自可信事件,则浏览器将只打开选项卡/窗口,而不会出现弹出窗口阻止程序警告。