Ваш Javascript будет выполняться на клиенте, а не на сервере. Это означает, что foo
не оценивается на стороне сервера, и поэтому его значение не может быть записано в файл на сервере.
Лучший способ подумать об этом процессе - это как будто вы генерируя текстовый файл динамически. Текст, который вы генерируете, становится исполняемым кодом после того, как браузер интерпретирует его. Только то, что вы размещаете между тегами <?php
, оценивается на сервере.
Кстати, создание привычки встраивать случайные фрагменты PHP-логики в HTML или Javascript может привести к серьезному запутанному коду. Я говорю от болезненного опыта.
Вы должны использовать более сложную функцию, например $.ajax()
, если вы хотите контролировать кеширование по каждому запросу. Или, если вы просто хотите отключить его для всего, поставьте это вверху вашего скрипта:
$.ajaxSetup ({
// Disable caching of AJAX responses
cache: false
});
Вы можете заменить функцию загрузки 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, и вы должны быть настроены. Ваш существующий код загрузки больше не будет кэшироваться.
Этот код может помочь вам
var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));
Другой подход, чтобы поставить нижнюю строку только тогда, когда требуется получить данные с сервера, добавьте следующую строку вместе с вашим URL-адресом ajax.
'? _ =' + Math.round (Math.random ( ) * 10000)
Если вы хотите придерживаться метода .load () JQuery, добавьте что-то уникальное в URL-адрес, например, метку времени JavaScript. "+ new Date (). getTime ()". Заметьте, мне пришлось добавить «& amp; time =», чтобы он не изменял вашу переменную pid.
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());
});
Один из способов - добавить уникальный номер в конец url:
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());
Где вы пишете uniqueId (), чтобы возвращать что-то другое при каждом вызове.
(+new Date)
(или new Date().getTime()
, если вы приверженец). См. . Как получить метку времени в JavaScript?
– thirdender
4 January 2014 в 01:58
Саша - хорошая идея, я использую микс.
Создаю функцию
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"); }},
Для PHP добавьте эту строку в свой скрипт, который обслуживает нужную вам информацию:
header("cache-control: no-cache");
или добавьте уникальную переменную в строку запроса:
"/portal/?f=searchBilling&x=" + (new Date()).getTime()
/**
* 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;
}
func.call(elem, data, textStatus, XMLHttpRequest);
– GeekyMonkey
25 February 2011 в 14:58
Вот пример того, как управлять кэшированием по каждому запросу
$.ajax({
url: "/YourController",
cache: false,
dataType: "html",
success: function(data) {
$("#content").html(data);
}
});
Я заметил, что если некоторые серверы (например, Apache2) не настроены на то, чтобы специально разрешить или запретить любое «кэширование», то сервер по умолчанию может отправить «кэшированный» ответ, даже если вы установите заголовки HTTP на «no- кэш». Поэтому убедитесь, что ваш сервер не «кэширует» что-либо до того, как он отправит ответ:
В случае 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»);
Это должно сделать трюк, отключающий кеш на стороне сервера. Ура! :)
Попробуйте следующее:
$("#Search_Result").load("AJAX-Search.aspx?q=" + $("#q").val() + "&rnd=" + String((new Date()).getTime()).replace(/\D/gi, ''));
Он отлично работает, когда я его использовал.
НЕ используйте временную метку для создания уникального URL-адреса, поскольку для каждой страницы, которую вы посещаете, кэшируется в DOM с помощью jquery mobile, и вы скоро столкнетесь с проблемой нехватки памяти на мобильных телефонах.
$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 = ""; для изменения URL-адреса, иначе вы перейдете на адрес, а страница будет загружена не будет. Чтобы обойти эту проблему, просто используйте window.location.hash = "";
Это особенно раздражает IE. В основном вам нужно отправить HTTP-заголовки «no-cache» обратно с ответом с сервера.