如何阻止Google Chrome阻止我的弹出窗口?

Ais*_*ina 38 javascript google-chrome popup popup-blocker

在我的网站上有一个按钮,用于调用一个调用的函数window.open,但是,最近在弹出窗口打开之前需要进行调整以进行服务器端检查.

自从添加了代码进行AJAX调用之后,浏览器就会阻止弹出窗口,这是在successAJAX调用的回调中打开的.我读过,如果没有用户点击事件调用,浏览器可能会阻止弹出窗口,所以我尝试将AJAX请求设置为async: false,这解决了Firefox中的问题,但谷歌Chrome仍然阻止我的弹出窗口.有没有办法解决这个问题?

我可以将服务器端检查移动到弹出窗口中打开的页面,但是如果可能的话,我想在打开弹出窗口之前执行此操作.

码:

<a id="attackButton" href="#">Attack Base!</a>

<script type="text/javascript">
$(function() {
    $('#attackButton').click(function() {
        $.ajax({
            url: baseurl + '/index.php?option=com_pbbgs&format=raw&getinfo=goingame',
            data: { 'gameid': 618 },
            dataType: 'text',
            async: false,
            type: 'POST',
            success: function(data) {
                eval(data);

                if (window.gameURL) {
                    goingameRaw();
                }
            }
        });

        return false;
    });
});

function goingameRaw()
{
    window.open(window.gameURL,'test','left=20,top=20,width=1024,height=640,toolbar=0,resizable=0,location=0');
}
</script>
Run Code Online (Sandbox Code Playgroud)

响应体示例:

window.gameURL="http://mydomain.com/index.php?option=com_pbbgs&format=raw&startgame=618&width=1024&height=640";checktutorial('js','attack');
Run Code Online (Sandbox Code Playgroud)

Emi*_*nov 47

是的,弹出窗口应该是用户操作的直接结果.在ajax回调中执行它们不会起作用.此外,使用async:false不好 - 在FF中,已知会阻止整个浏览器.想一想其他方法来做检查:

  • 它可能是你在弹出窗口中做的第一件事
  • 您可以在点击时打开弹出窗口,稍后在回调触发时对其进行操作
  • 您可以要求用户再次单击某个按钮以触发弹出窗口(可能是最糟糕的解决方案)
  • 你可以在页面加载时做到这一点

  • 我怀疑,谢谢.我实施了你的第二个建议. (3认同)

gab*_*abe 20

继Emil的优秀答案之后,"你可以点击弹出窗口,稍后在回调触发时操纵它".我用过这个实现.

$('#attackButton').click(function() {
Run Code Online (Sandbox Code Playgroud)

这里有新代码

    var win = window.open('');
    window.oldOpen = window.open;
    window.open = function(url) { // reassignment function
        win.location = url;
        window.open = oldOpen;
        win.focus();
    }
Run Code Online (Sandbox Code Playgroud)

结束新代码

    $.ajax({
        url: baseurl + '/index.php',
        data: { 'gameid': 618 },
        type: 'POST',
        success: function(data) {
            window.open('some url'); // will call reassignment function above 
        }
    });

    return false;
});
Run Code Online (Sandbox Code Playgroud)

  • 没有必要添加全局变量'oldOpen'并重载本机全局'open'.这都在同一个闭包内,范围链完全没问题.只需创建一个本地函数"myWinGo"或其他任何东西并使用它. (4认同)

小智 6

您可以在onclick事件下打开一个未被阻止的窗口,如果在ajax调用中打开它,则会将其视为弹出窗口.但是我使用这种方法成功了一段时间来打开弹出窗口而不是被阻止.

http://en.nisi.ro/blog/development/javascript/open-new-window-window-open-seen-chrome-popup/