1

ボタンに onclick イベント ハンドラをアタッチしたいと考えています。しかし、js変数が設定されていない場合は呼び出されたくありません。代わりに、関数呼び出しを保存してから、必要なときに実行する必要があります。このようなことは可能ですか?

編集:詳細説明:

したがって、基本的には、sdk がまだロードされていないため、onclick イベント ハンドラーを呼び出す必要がありますが、呼び出しは実行されず、代わりにどこかに格納されます (キューに格納される場合があります)。次に、別のコード スニペットで、SDK が読み込まれたかどうかを確認し、読み込まれたら、キューに保留中の呼び出しがあるかどうかを確認して実行します。これは明らかにブラウザをロックしません。

PS: 基本的に、JS SDK を使用して Facebook ログインを webapp に統合しています。そのため、FB.login 関数は SDK がロードされている場合にのみ機能しますが、ユーザーがログイン ボタンをクリックすることを拒否したくありません。したがって、SDK が読み込まれていない場合、呼び出しは保存され、SDK が読み込まれたら手動で実行できます。

4

4 に答える 4

0

このようなもので十分でしょうか?

function onClickHandler(callback)
{
    // Initialize queue array on the first usage
    if (!this.queue)
        this.queue = [];

    //checking blah variable
    if (typeof(blah) == "undefined")
    {
        //blah doesn't exit, store callback in queue
        if (callback)
            this.queue.push(callback)
    }
    else
    {
        //execute all stored callback functions first
        if (this.queue.length)
        {
            this.queue.slice().forEach(function(callback) callback());
            this.queue.length = 0;
        }

        if (callback)
            callback()
    }
}

(function loop()
{
    if (typeof(blah) == "undefined")
        setTimeout(loop, 100);
    else
    {
        /*
            blah variable exists
            execute all stored (if any) callback functions
        */
        onClickHandler();
    }
})()

基本的に、ループを作成して何とか変数をチェックし、この変数が利用可能になるまでチェックを続けます。それは醜いですが、動作します。

于 2013-11-13T08:28:47.817 に答える
0

単一のトリガーを使用した別の提案:

var loaded = false, clicked = false;

$('button').one('click', function handler() {
    if (clicked = !loaded) {
        $(this).one('click', handler);
        return;
    }
    // do something when loaded === true
});

setTimeout(function () {
    loaded = true;
    if (clicked) $('button').trigger('click');
}, 3000);

そしてライブデモ: http://jsfiddle.net/wared/DH6DU/ .

于 2013-11-13T09:07:54.333 に答える