2012-04-13 40 views
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(); 
    }); 
}); 

如果我直接調用的函數,彈出窗口阻止程序不會阻止我的彈出窗口,因爲window.open是由用戶單擊觸發的。但使用鏈,彈出式窗口攔截器會阻止我的彈出窗口。

我該如何避免它?

ps:這是Facebook的彈出窗口,我沒有試圖做一些我不應該做的事情。

回答

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(); 
    }); 
}); 
+0

有一個在每一個AJAX調用然後= \。 – user1330271 2012-04-13 18:21:26

+1

然後立即打開窗口(例如,在ajax調用之後的** not **),並像在我的示例中一樣傳遞參考。 – Halcyon 2012-04-13 18:22:29

+0

問題是:我需要服務器端檢查用戶是否有Facebook的提供者或沒有打開彈出之前。但我認爲你的榜樣將解決它。謝謝。 – user1330271 2012-04-13 18:30:15