2

我有树函数:

var a = function (f)
{
    // some code
    window.open("")
    f();
};

var b = function (f)
{
   // some code
   f();
}

var c = function()
{
}

我正在使用带有匿名函数的链调用函数:

a(function () {
    b(function () {
        c();
    });
});

如果我直接调用 a 函数,弹出窗口阻止程序不会阻止我的弹出窗口,因为 window.open 是由用户单击触发的。但是使用链,弹出窗口阻止程序阻止了我的弹出窗口。

我怎样才能避免它?

ps:这是facebook弹出窗口,我不想做我不应该做的事情。

4

1 回答 1

3

不同的浏览器表现不同。我认为 Firefox 是最严格的,只允许在与 onclick 相同的事件循环中直接生成弹出窗口。在 Chrome 中,您可以在两者之间进行异步调用,它仍然可以工作。- 至少那是我记忆中的记忆。

问题是,你几乎无法控制它。是否允许弹出窗口取决于浏览器。您可以为每个浏览器开发一些启发式方法,但这并不理想。

尝试找到一个解决方案,该解决方案将window.open在最有可能工作的同一个偶数循环中调用(如果这不起作用,则可以安全地假设什么都不起作用)。也许是a()异步的?通过闭包,您可以将引用传递var my_window = window.open给任何后续函数,以防您稍后需要向 DOM 添加内容。

例子:

var a = function (f) {
    var my_window = window.open("");
    f(my_window);
};

var b = function (f) {
   f();
};

var c = function() {};

a(function (my_window) {
    my_window.innerHTML = "hello";
    b(function () {
        c();
    });
});
于 2012-04-13T18:19:17.693 回答