कैश होने से jQuery लोड करें। प्रतिक्रिया रोकें




ajax caching (10)

PHP के लिए, इस लाइन को अपनी स्क्रिप्ट में जोड़ें जो आपकी इच्छित जानकारी प्रदान करता है:

header("cache-control: no-cache");

या, क्वेरी स्ट्रिंग में एक अद्वितीय चर जोड़ें:

"/portal/?f=searchBilling&x=" + (new Date()).getTime()

मेरे पास एक यूआरएल पर जीईटी अनुरोध करने वाला निम्नलिखित कोड है:

$('#searchButton').click(function() {
    $('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val());            
});

लेकिन लौटा परिणाम हमेशा परिलक्षित नहीं होता है। उदाहरण के लिए, मैंने प्रतिक्रिया में बदलाव किया जो एक स्टैक ट्रेस थूक गया लेकिन जब मैंने खोज बटन पर क्लिक किया तो स्टैक ट्रेस दिखाई नहीं दिया। मैंने अंतर्निहित PHP कोड को देखा जो AJAX प्रतिक्रिया को नियंत्रित करता है और उसके पास सही कोड था और पृष्ठ पर जाकर सीधे सही परिणाम दिखाया गया था लेकिन आउटपुट द्वारा लोड किया गया आउटपुट पुराना था।

यदि मैं ब्राउज़र बंद करता हूं और इसे फिर से खोलता हूं तो यह एक बार काम करता है और फिर बासी जानकारी वापस करना शुरू कर देता है। क्या मैं इसे jQuery द्वारा नियंत्रित कर सकता हूं या क्या मुझे अपने PHP स्क्रिप्ट आउटपुट हेडर को कैशिंग को नियंत्रित करने की आवश्यकता है?


आप jquery लोड फ़ंक्शन को उस संस्करण के साथ प्रतिस्थापित कर सकते हैं जिसमें कैश सेट गलत है।

(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 भार के बाद चलाएगा और आपको पूरा सेट होना चाहिए। आपका मौजूदा लोड कोड अब कैश नहीं किया जाएगा।


एक अद्वितीय यूआरएल बनाने के लिए टाइमस्टैम्प का उपयोग न करें क्योंकि आपके द्वारा देखे जाने वाले प्रत्येक पृष्ठ को jquery मोबाइल द्वारा डीओएम में कैश किया गया है और आप जल्द ही मोबाइल पर मेमोरी चलाने की परेशानी में भाग लेते हैं।

$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 () का उपयोग कर सकते हैं कि यूआरएल वह है जिसे आप कैश करना चाहते हैं या नहीं और उसके अनुसार कैश पैरामीटर सेट करें।

Window.location = "" का प्रयोग न करें; यूआरएल बदलने के लिए अन्यथा आप पते पर नेविगेट करेंगे और पेजबेरलोड लोड नहीं होगा। इस समस्या को हल करने के लिए बस window.location.hash = "" का उपयोग करें;


एक तरीका यूआरएल के अंत में एक अद्वितीय संख्या जोड़ना है:

$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());

जहां आप अद्वितीय आईडी () लिखते हैं, हर बार इसे अलग करने के लिए कुछ अलग करने के लिए।


मैंने देखा कि अगर कुछ सर्वर (जैसे Apache2) को किसी भी "कैशिंग" को विशेष रूप से अनुमति देने या अस्वीकार करने के लिए कॉन्फ़िगर नहीं किया गया है, तो सर्वर डिफ़ॉल्ट रूप से "कैश" प्रतिक्रिया भेज सकता है, भले ही आप HTTP शीर्षलेख को "नो-कैश" पर सेट करते हैं। तो सुनिश्चित करें कि आपका सर्वर प्रतिक्रिया देने से पहले कुछ भी "कैशिंग" नहीं कर रहा है:

अपाचे 2 के मामले में आपको करना होगा

1) "disk_cache.conf" फ़ाइल को संपादित करें - कैश को अक्षम करने के लिए "कैशडिज़ेबल / लोकल_फाइल" निर्देश जोड़ें

2) लोड mod_cache मॉड्यूल (Ubuntu "sudo a2enmod कैश" और "sudo a2enmod disk_cache" पर)

3) Apache2 को पुनरारंभ करें (उबंटू "सुडो सेवा apache2 पुनरारंभ करें");

यह सर्वर पक्ष पर कैश अक्षम करने की चाल करना चाहिए। चीयर्स! :)


यदि आप Jquery's .load () विधि से चिपकना चाहते हैं, तो जावास्क्रिप्ट टाइमस्टैम्प जैसे यूआरएल में कुछ अद्वितीय जोड़ें। "+ नई तिथि ()। getTime ()"। नोटिस मुझे एक "और समय =" जोड़ना था, इसलिए यह आपके पिड चर को बदल नहीं देता है।

$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());            
});

यह आईई में विशेष परेशानियों का है। मूल रूप से आपको सर्वर से आपकी प्रतिक्रिया के साथ 'नो-कैश' HTTP शीर्षलेख वापस भेजना होगा।


यह कोड आपकी मदद कर सकता है

var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));

साशा अच्छा विचार है, मैं मिश्रण का उपयोग करता हूं।

मैं एक समारोह बनाते हैं

LoadWithoutCache: function (url, source) {
    $.ajax({
        url: url,
        cache: false,
        dataType: "html",
        success: function (data) {
            $("#" + source).html(data);
            return false;
        }
    });
}

और मेरे पृष्ठ के अलग-अलग हिस्सों के लिए आह्वान करें उदाहरण के लिए init पर:

इनिट: फ़ंक्शन (actionUrl1, actionUrl2, actionUrl3) {

var उदाहरण जेएस = {

Init: function (actionUrl1, actionUrl2, actionUrl3)           ExampleJS.LoadWithoutCache(actionUrl1, "div1");

ExampleJS.LoadWithoutCache (actionUrl2, "div2"); ExampleJS.LoadWithoutCache (actionUrl3, "div3"); }},


/**
 * 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;
}






caching