34

By Default $.getScript() disables caching and you can use $.ajaxSetup and set caching to true. When testing if the script is actually cached with Firebug most of the time the script is coming back at 200 (Which means the script is a fresh copy) and one in maybe 20 or 30 times it will come back 304 (meaning it used a cached version). Why is it getting a new copy the vast majority of the time?

$.ajaxSetup({
    cache: true
 });

 $.getScript( scriptFile );

The files that getScript retrieves have not been edited and the requests are a page change apart.

4

6 に答える 6

31

最初に、jQuery がキャッシュを無効にすることの意味を明確にします。

jQueryがキャッシュを無効にすると、URL の末尾にパラメーターとして 1 つの余分な乱数を追加するなど、何らかのトリックを使用して、ブラウザーによってファイルが再度読み込まれるようになります。

jQueryがキャッシュを有効にしている場合、何も強制せず、このファイルのヘッダーに設定したキャッシュを許可します。つまり、ファイル パラメーターのヘッダーを設定してブラウザー キャッシュに保存していない場合、ブラウザーは何らかの方法でファイルを再度読み込もうとします。

そのため、jQuery によるキャッシュを有効にすると、静的ファイルに正しいキャッシュ ヘッダーを設定してブラウザー キャッシュに保持する必要があります。

ブラウザがヘッダーの作成日を確認し、サーバーに接続してヘッダーを再度要求し、それを比較し、変更がない場合は再度ロードせず、サーバーに1回呼び出しを行うファイルの場合。

最大有効期間を設定し、その日付までサーバーに要求しないファイルの場合、ブラウザーはそれを見つけた場合、キャッシュから直接ロードします。

要約すると、ブラウザは、送信したヘッダーから
このcache:trueファイルのキャッシュを決定します。
これcache:falseは、ファイルを再度ロードすることを強制します。

キャッシュ関連の質問:
JavaScript ファイルのキャッシング
IIS7 Cache-Control

内部コード
getScript()is calling the jQuery.get()witch は、Ajax 関数の短縮形です。

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

したがって、 を呼び出すgetScript()ことで ajax 呼び出しが行われ、そもそもこれがあなたの考えである場合、jQuery はファイルのいかなる種類のキャッシュも保持しませんでした。

sript をロードするためのカスタム関数
グローバルな cache:true を作成することに勝てず、cache:true でロードする必要があるのは一部のファイルのみである場合は、カスタム関数を次のように作成できます。

function getScriptCcd(url, callback)
{
    jQuery.ajax({
            type: "GET",
            url: url,
            success: callback,
            dataType: "script",
            cache: true
    });
};

これはグローバル キャッシュ パラメータの影響を受けず、最後にキャッシュ以外のパラメータを追加せずにスクリプト ファイルをロードします。

于 2012-10-14T19:08:24.117 に答える
4

デフォルトでは、$.getScript() はキャッシュ設定を false に設定します。これにより、タイムスタンプ付きのクエリ パラメータがリクエスト URL に追加され、リクエストされるたびにブラウザがスクリプトをダウンロードするようになります。

jQuery doc サイトには、要求にタイムスタンプを追加せず、キャッシュをバイパスするための優れた拡張機能があります。

jQuery.cachedScript = function( url, options ) {

  // Allow user to set any option except for dataType, cache, and url
  options = $.extend( options || {}, {
    dataType: "script",
    cache: true,
    url: url
  });


  // Use $.ajax() since it is more flexible than $.getScript
  // Return the jqXHR object so we can chain callbacks
  return jQuery.ajax( options );
};

// Usage
$.cachedScript( "ajax/test.js" ).done(function( script, textStatus ) {
  console.log( textStatus );
});

ソース

于 2016-01-14T07:21:25.367 に答える
4

実際にはより良いオプションがあります。たとえば、特定のリクエストに対してキャッシュをオンにすることができます。

$.ajaxPrefilter(function( options ) {
  if ( options.type==='GET' && options.dataType ==='script' ) {
      options.cache=true;
  }
});
于 2017-03-08T19:39:30.253 に答える