65

私のページ本文では、AJAX呼び出しの結果として次のコードを挿入する必要があります。

    <p>Loading jQuery</p>
    <script type='text/javascript' src='scripts/jquery/core/jquery-1.4.4.js'></script>
    <p>Using jQuery</p>
    <script type='text/javascript'>
        $.ajax({
            ...
        });
    </script>

ドキュメントが既に読み込まれているため使用できませ$.load()ん。イベントは発生しません。

これは安全ですか?そうでない場合は、カスタムで生成されたコードが実行される前に、jqueryスクリプトがロードされていることを確認するにはどうすればよいですか。

4

8 に答える 8

46

それはかなり安全です。歴史的に、<script>タグは完全にブロックされているため<script>、前者の解析/実行が完了する前に 2 番目のタグに遭遇することはありません。唯一の問題は、「最新の」ブラウザーがスクリプトを非同期で遅延してロードする傾向があることです。したがって、順序が正しいことを確認するには、次のように使用します。

<p>Loading jQuery</p>
<script type='text/javascript' async=false defer=false src='scripts/jquery/core/jquery-1.4.4.js'></script>
<p>Using jQuery</p>
<script type='text/javascript'>
    $.ajax({
        ...
    });
</script>

ただし、これを HTML 文字列として DOM にプッシュするのではなく、動的なスクリプト タグの挿入を使用することをお勧めします。同じ話だろう

var scr  = document.createElement('script'),
    head = document.head || document.getElementsByTagName('head')[0];
    scr.src = 'scripts/jquery/core/jquery-1.4.4.js';
    scr.async = false; // optionally

head.insertBefore(scr, head.firstChild);
于 2011-09-05T13:46:05.943 に答える
11

にも新機能がありjQuery 1.6ます。といいjQuery.holdReady()ます。それは実際には自明です。を呼び出すとjQuery.holdReady(true)、を呼び出すreadyまでイベントは発生しませんjQuery.holdReady(false)。これを false に設定しても、ready イベントは自動的に発生せず、ホールドが解除されるだけです。

ドキュメントから抜粋したスクリプトをロードするノンブロッキングの例を次に示します。

$.holdReady(true);
$.getScript("myplugin.js", function() {
     $.holdReady(false);
});

詳細については、 http://api.jquery.com/jQuery.holdReady/を参照してください。

于 2011-09-05T20:50:17.417 に答える
-2

$.ajax と $.load は同じものです。どちらでも使用できます。$.load をページの script タグに入れると、$.ajax() のようにロード時に起動します。

何かをする前にスクリプトが起動するのを待つことに関しては、Tomalak が言ったことはちょっと真実です。例外は、非同期呼び出しです。Javascript は AJAX 呼び出しを行い、スクリプトの実行を継続し、AJAX 呼び出しが応答すると、指示内容に応じて成功/失敗を実行します。

ここで、JS がリターンを待つようにしたいとします。1 回の呼び出しですべてを成功コールバックにラップするだけで非常に簡単です。または、クールな方法で $.deferred を使用することもできます。これにより、一連の ajax 呼び出しまたは 1 回の呼び出しを行い、終了後にのみいくつかのコードを実行できます。

$.when と $.then は、おそらくこの状況に最適です。

あなたがしていることはとにかく安全です。

于 2011-09-05T13:47:09.510 に答える