Javascript 传递函数作为参数和弹出窗口拦截器

Javascript 传递函数作为参数和弹出窗口拦截器,javascript,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函数,弹出窗口

我得到了树函数:

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弹出窗口,我没有尝试做我不应该做的事情。

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

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

尝试找到一个调用
窗口的解决方案。在最有可能工作的相同偶数循环中打开
(如果不工作,可以安全地假设没有工作)。
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();
    });
});

每个then=\中都有一个ajax调用。然后立即打开窗口(如中所示,而不是在ajax调用之后),并像我的示例中那样传递引用。问题是:在打开弹出窗口之前,我需要在服务器端检查用户是否有facebook提供商。但我认为你的例子会解决这个问题。谢谢,我明白了。。嗯,我想你总是可以显示一个错误。。或者在呈现生成事件的按钮之前进行检查。流程是:用户单击菜单项(邀请朋友),如果没有facebook提供商,则我打开弹出窗口,以便用户可以登录facebook。登录完成后,将调用关联帐户的方法,然后调用填充好友的方法。我必须更改它,如果用户没有facebook提供商,我将显示一个按钮,以便他可以单击该按钮并打开弹出窗口。谢谢你,你提供的信息很重要。