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


244

मेरे पास URL पर GET अनुरोध करने वाला निम्नलिखित कोड है:

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

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

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

जवाबों:


419

$.ajax()यदि आप प्रति-अनुरोध के आधार पर कैशिंग को नियंत्रित करना चाहते हैं तो आपको अधिक जटिल फ़ंक्शन का उपयोग करना होगा। या, यदि आप इसे हर चीज के लिए बंद करना चाहते हैं, तो इसे अपनी स्क्रिप्ट के शीर्ष पर रखें:

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

2
धन्यवाद! यह भी jQuery प्रलेखन में स्थित है? आह… यह पाया। बेरीड की तरह। यह दिन के अधिकांश के लिए बट द्वारा लात मार रहा था ... फिर से धन्यवाद!
बाइटबेंडर

35
यह सब कैश: गलत है एक नंबर संलग्न है (मेरा मानना ​​है कि इसका टाइमस्टैम्प) अनुरोध करते समय एक यूआरएल के अंत में। कैश सेटिंग्स को संभालने के लिए दूसरी जगह विभिन्न HTTP रिस्पॉन्स हेडर, जैसे
एक्सपायर

1
जानकारी के इस टुकड़े ने मुझे बहुत परेशान किया
इसने

इसे प्यार करना! अब मुझे अत्यधिक क्रिया .ajax कॉल का उपयोग करने की आवश्यकता नहीं है और शॉर्टकट का उपयोग कर सकते हैं!
गैटस्टर

1
शानदार - मुझे यह फंक्शन मिला, लेकिन यह नहीं पता था कि यह एक डिव में एक टेक्स्ट डॉक्यूमेंट लोड करने के समान सरल काम करेगा। लोड
Dan

107

यहां प्रति-अनुरोध के आधार पर कैशिंग को नियंत्रित करने का एक उदाहरण दिया गया है

$.ajax({
    url: "/YourController",
    cache: false,
    dataType: "html",
    success: function(data) {
        $("#content").html(data);
    }
});

7
मैं इस तरह से बेहतर है कि बस सभी कैशिंग को बंद कर दूं।
पॉल टॉम्बलिन

मुझे यह भी पसंद है कि सभी कैशिंग बंद न करें। इसके अलावा, फ़िल्टर करने के लिए इस पोस्ट को भी देखें [लिंक] stackoverflow.com/questions/4245231/…
दान डोयोन

@ मार्शाल ने यहां यू कोड को POST या गेट प्रकार का उल्लेख नहीं किया है ...... तो jquery के लिए क्या डिफ़ॉल्ट है?
थॉमस

डिफ़ॉल्ट विधि
रिच टी।

35

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

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

जहाँ आप यूनिक आई डी लिखते हैं () हर बार कुछ अलग लौटाने के लिए जिसे यह कहा जाता है।


1
और भी आसान, बस उपयोग करें (+new Date)(या new Date().getTime()यदि आप एक स्टिकलर हैं)। देखें कि आपको जावास्क्रिप्ट में टाइमस्टैम्प कैसे मिलता है?
23

एक नया प्रश्न पूछें और इसे यहां लिंक करें। यदि आपने इसे सही किया है, तो आप पूरी तरह से नए URL उत्पन्न कर रहे हैं, इसलिए वे संभवतः ब्राउज़र द्वारा कैश नहीं किए जा सकते।
लो फ्रेंको

इसका उपयोग किसी असंबंधित समस्या को हल करने के लिए किया जाता है। एक इलाज करता है।
एलेक्स

9

सर्वर से डेटा प्राप्त करने की आवश्यकता होने पर केवल नीचे की लाइन डालने के लिए एक और तरीका, अपने ajax url के साथ नीचे की रेखा को जोड़ें।

'? _ =' + गणित.गोल (math.random () * 10000)


6
/**
 * 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);
फ़ंक

5

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

मैं एक फंक्शन बनाता हूं

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

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

Init: फ़ंक्शन (actionUrl1, actionUrl2, actionUrl3) {

var ExampleJS = {

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

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


4

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


3

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

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

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

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

कैश: $ .ajax फ़ंक्शन पर गलत विकल्प स्वचालित रूप से आपके दूसरे सुझाव की तरह क्वेरी स्ट्रिंग में अद्वितीय चर जोड़ता है।
ब्रायन रेहबिन

2

डोमेस्टैंप का उपयोग न करें क्योंकि आपके द्वारा विज़िट किए गए प्रत्येक पृष्ठ के लिए डोम में 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 को कैश करना चाहते हैं या नहीं, यह निर्धारित करने के लिए url.indexOf () का उपयोग कर सकते हैं और तदनुसार कैश पैरामीटर सेट करें।

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


1
$ jqm क्या है? $ jqm = $? $ .mobile.cache अपरिभाषित है
Luciuz

2

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

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

1

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


0

इसे इस्तेमाल करे:

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

यह ठीक काम करता है जब मैंने इसका इस्तेमाल किया।


0

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

Apache2 के मामले में आपके पास है

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

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

3) Apache2 (Ubuntu "sudo service apache2 पुनरारंभ") को पुनः आरंभ करें;

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.