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のポップアップです。私は、自分がやるべきではないことをやろうとはしていません。

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 に答える