0

initialise2つの条件が満たされたときにトリガーしたい関数がアプリにあります:1)ウィンドウがロードされました:および$(window).load()2)Typekitがロードされました。

$(window).load(function() {
    try {
        Typekit.load({ active: initialise });
    } catch (e) {}
});

現時点では、このコードは、ウィンドウが読み込まれるまで(画像などのすべてのリソースを含む)待機してから、Typekit Webフォントの読み込みを開始します。その後、読み込みが完了すると、初期化されます。

ただし、ウィンドウが読み込まれる前にTypekitを読み込む必要があります。それらは非同期でロードする必要があります。それで:

$(window).load(initialise);

try {
    Typekit.load({ active: initialise });
} catch (e) {}

現在、Webフォントは非同期で読み込まれていますが、問題は、 1)ウィンドウが読み込まれたときと2)Typekitが読み込まれinitialiseたときの両方でのみトリガーする関数が必要なことです。$(window).load()Typekitがロードされる前にウィンドウがロードされる場合もあれば、その逆の場合もあります。

だから私の質問は、initialise私の両方の基準が満たされたらすぐにトリガーするにはどうすればよいですか?

4

4 に答える 4

1

各イベントでインクリメントしてテストします。正readyの場合、initialize発砲します:

   {
        var ready = -1;
        $(window).load(function() {
            if (++ready) initialize();
        });

        try {
            Typekit.load({
                active: function() {
                    if (++ready) initialize();
                }
            });
        } catch (e) {}

        function initialize() {
            //do work
        }
    }
于 2012-01-28T15:00:12.290 に答える
0

load()ウィンドウがロードされたときにトリガーする正しい方法ではありません。ですready()

Typekit.load({
    active: function () {
        $(document).ready(initialize);
    }
});

ready()ウィンドウがすでにロードされている場合、メソッドはすぐにコールバックを実行します。このload()メソッドは、イベントハンドラーをloadDOMイベントにバインドします。DOMイベントは、その時点ですでに発生しています。したがって、ハンドラーが呼び出されることはありません。

于 2012-01-28T14:57:26.033 に答える
0

jQueryを使用するソリューションを見つけました$.holdReady

$.holdReady(true);

Typekit.load({
    active: function () {
        $.holdReady(false);
    }
});

$window.load(function () {
    $document.ready(initialize);
});
于 2012-01-28T15:16:02.370 に答える
-1

setIntervalを使用して、設定される2つの変数を確認できます。

var windowLoaded = false, typeKitLoaded = false, myLoadedInterval = null;
$(window).load(function() { windowLoaded = true; if ( myLoadedInterval == null ) beginInterval(); });
try {
    Typekit.load({ active: function() { typeKitLoaded = true; if ( myLoadedInterval == null ) beginInterval(); } });
} catch (e) {}

function beginInterval()
{
    myLoadedInterval = setInterval(function() {
        if ( typeKitLoaded && windowLoaded ) 
        {
            clearInterval(myLoadedInterval);
            initialise();
        } 
    }, 25);
}
于 2012-01-28T14:50:16.737 に答える