我有树功能:
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弹出窗口,我不是想做一些我不应该做的事情。
答案 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();
});
});