传递函数作为参数和弹出窗口阻止程序

时间:2012-04-13 18:11:58

标签: javascript

我有树功能:

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弹出窗口,我不是想做一些我不应该做的事情。

1 个答案:

答案 0 :(得分: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();
    });
});