URLでGETリクエストを行う次のコードがあります。
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val());
});
ただし、返される結果は常に反映されるわけではありません。たとえば、スタックトレースを吐き出す応答を変更しましたが、検索ボタンをクリックしてもスタックトレースが表示されませんでした。 ajax応答を制御する基になるPHPコードを見て、正しいコードがあり、ページにアクセスすると正しい結果が直接表示されましたが、.loadによって返される出力は古いものでした。
ブラウザを閉じて再度開くと、一度動作し、古い情報を返し始めます。これをjQueryで制御できますか、キャッシュを制御するためにPHPスクリプト出力ヘッダーが必要ですか?
要求ごとにキャッシュを制御する場合は、$.ajax()
などのより複雑な関数を使用する必要があります。または、すべてを無効にする場合は、これをスクリプトの先頭に配置します。
$.ajaxSetup ({
// Disable caching of AJAX responses
cache: false
});
以下は、リクエストごとにキャッシュを制御する方法の例です
$.ajax({
url: "/YourController",
cache: false,
dataType: "html",
success: function(data) {
$("#content").html(data);
}
});
1つの方法は、URLの末尾に一意の番号を追加することです。
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());
UniqueId()を記述して、呼び出されるたびに異なるものを返します。
サーバーからデータを取得する必要がある場合にのみ下の行を配置する別のアプローチは、あなたのajaxのURLと一緒に下の行を追加します。
'?_ =' + Math.round(Math.random()* 10000)
/**
* Use this function as jQuery "load" to disable request caching in IE
* Example: $('selector').loadWithoutCache('url', function(){ //success function callback... });
**/
$.fn.loadWithoutCache = function (){
var elem = $(this);
var func = arguments[1];
$.ajax({
url: arguments[0],
cache: false,
dataType: "html",
success: function(data, textStatus, XMLHttpRequest) {
elem.html(data);
if(func != undefined){
func(data, textStatus, XMLHttpRequest);
}
}
});
return elem;
}
サーシャはいい考えだ、ミックスを使う。
関数を作成します
LoadWithoutCache: function (url, source) {
$.ajax({
url: url,
cache: false,
dataType: "html",
success: function (data) {
$("#" + source).html(data);
return false;
}
});
}
そして、例えばinitで私のページのさまざまな部分を呼び出します:
Init:function(actionUrl1、actionUrl2、actionUrl3){
var ExampleJS = {
Init: function (actionUrl1, actionUrl2, actionUrl3) ExampleJS.LoadWithoutCache(actionUrl1, "div1");
ExampleJS.LoadWithoutCache(actionUrl2、 "div2"); ExampleJS.LoadWithoutCache(actionUrl3、 "div3"); }}、
これはIEでは特に厄介です。基本的に、サーバーからの応答とともに「no-cache」HTTPヘッダーを返送する必要があります。
PHPの場合、必要な情報を提供する次の行をスクリプトに追加します。
header("cache-control: no-cache");
または、クエリ文字列に一意の変数を追加します。
"/portal/?f=searchBilling&x=" + (new Date()).getTime()
訪問するすべてのページがjquery mobileによってDOMにキャッシュされるため、タイムスタンプを使用して一意のURLを作成しないでください。すぐにモバイルでメモリ不足の問題が発生します。
$jqm(document).bind('pagebeforeload', function(event, data) {
var url = data.url;
var savePageInDOM = true;
if (url.toLowerCase().indexOf("vacancies") >= 0) {
savePageInDOM = false;
}
$jqm.mobile.cache = savePageInDOM;
})
このコードは、ページがロードされる前にアクティブになります。url.indexOf()を使用して、URLがキャッシュするかどうかを判断し、それに応じてキャッシュパラメーターを設定できます。
Window.location = "";は使用しないでください。そうしないと、アドレスに移動し、pagebeforeloadは起動しません。この問題を回避するには、単にwindow.location.hash = "";を使用します。
Jqueryロード関数を、キャッシュがfalseに設定されたバージョンに置き換えることができます。
(function($) {
var _load = jQuery.fn.load;
$.fn.load = function(url, params, callback) {
if ( typeof url !== "string" && _load ) {
return _load.apply( this, arguments );
}
var selector, type, response,
self = this,
off = url.indexOf(" ");
if (off > -1) {
selector = stripAndCollapse(url.slice(off));
url = url.slice(0, off);
}
// If it's a function
if (jQuery.isFunction(params)) {
// We assume that it's the callback
callback = params;
params = undefined;
// Otherwise, build a param string
} else if (params && typeof params === "object") {
type = "POST";
}
// If we have elements to modify, make the request
if (self.length > 0) {
jQuery.ajax({
url: url,
// If "type" variable is undefined, then "GET" method will be used.
// Make value of this field explicit since
// user can override it through ajaxSetup method
type: type || "GET",
dataType: "html",
cache: false,
data: params
}).done(function(responseText) {
// Save response for use in complete callback
response = arguments;
self.html(selector ?
// If a selector was specified, locate the right elements in a dummy div
// Exclude scripts to avoid IE 'Permission Denied' errors
jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
// Otherwise use the full result
responseText);
// If the request succeeds, this function gets "data", "status", "jqXHR"
// but they are ignored because response was set above.
// If it fails, this function gets "jqXHR", "status", "error"
}).always(callback && function(jqXHR, status) {
self.each(function() {
callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
});
});
}
return this;
}
})(jQuery);
これをjqueryのロード後に実行するグローバルな場所に配置すると、すべての設定が完了します。既存のロードコードはキャッシュされなくなります。
これを試して:
$("#Search_Result").load("AJAX-Search.aspx?q=" + $("#q").val() + "&rnd=" + String((new Date()).getTime()).replace(/\D/gi, ''));
私はそれを使用したときにうまく動作します。
一部のサーバー(Apache2など)が「キャッシュ」を明確に許可または拒否するように構成されていない場合、HTTPヘッダーを「no-cache」に設定しても、サーバーはデフォルトで「キャッシュ」応答を送信する場合があります。したがって、応答を送信する前に、サーバーが何かを「キャッシュ」していないことを確認してください。
Apache2の場合には、
1)「disk_cache.conf」ファイルを編集します-キャッシュを無効にするには、「CacheDisable/local_files」ディレクティブを追加します
2)mod_cacheモジュールをロードします(Ubuntuでは「Sudo a2enmod cache」および「Sudo a2enmod disk_cache」)
3)Apache2を再起動します(Ubuntu "Sudo service Apache2 restart");
これは、サーバー側でキャッシュを無効にするトリックを実行する必要があります。乾杯! :)
Jqueryの.load()メソッドを使いたければ、JavaScriptタイムスタンプのようなURLに固有のものを追加してください。 「+新しいDate()。getTime()」。 pid変数を変更しないように、「&time =」を追加する必要があることに注意してください。
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());
});
このコードはあなたを助けるかもしれません
var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));