2010-01-15 58 views
1

我正在做一個項目,它使用javascript從基於用戶在字段中輸入的文本(用Python編寫並使用Django界面)獲取信息(查詢每個鍵入),然後顯示該信息。基本上,這顯示「找不到工作」或顯示該工作的名稱,用戶名和餘額。在Firefox中,這一切都很好。我可以輸入一個JobID,它告訴我這個ID是新的,我可以創建這個工作。然後,我可以立即回到頁面並輸入該ID,並且我的查找將返回有關該作業的正確信息。IE緩存問題打破了我的查詢字段

事情是,Internet Explorer 8是懶惰的。如果我在IE8中輸入工作ID,我的函數會調用查找頁面(/ deposits/orglookup /?q = 123)並獲取一個值。因此,例如,如果它變爲False,那麼我可以使用該ID創建一個新作業。如果我然後瀏覽並在同一個查找字段中輸入相同的數字,Internet Explorer將不刷新查找頁面,因此它會再次返回false。如果我瀏覽到該查找頁面,則會看到錯誤的值,但如果我刷新它,我會再次獲得正確的信息。任何想法如何我可以強制這個查詢每次我輸入我的查閱字段,而不是像IE瀏覽器緩存頁面?

我會補充一點,它不會讓我在每個用戶的基礎上解決這個問題,因爲這是一個組織範圍的應用程序,所以我真的可以使用修復程序,我可以寫入我的代碼強制IE瀏覽器實際上每次應該刷新查找頁面。

下面是查找功能的代碼,如果有幫助的話。這有點亂,但我沒有寫,所以我會嘗試包括所有相關的東西:

$("#id_JobID").keyup( 

    function(event){ 

     //only fire gets on 0-9, kp 0-9, backspace, and delete 
     if (event.keyCode in { 96:1, 97:1, 98:1, 99:1, 100:1, 101:1, 102:1, 103:1, 104:1, 105:1, 
           46:1,48:1, 49:1, 50:1, 51:1, 52:1, 53:1, 54:1, 55:1, 56:1, 57:1, 8:1}) 
     { 

      if ($("#loadimg").attr("src") != "/static/icons/loading.gif") { 
       $("#loadimg").attr("src", "/static/icons/loading.gif"); 
      } 

      if ($("#loadimg").length < 1) { 
       $("#id_JobID").parent().append("<img id=loadimg src=/static/icons/loading.gif>"); 
      } 

      clearTimeouts(null); //clear all existing timeouts to stop any running lookups 
      GetCounter++; 
      currLoc = window.location.href.slice(window.location.href.indexOf('?') + 1).split('/').slice(-2,-1); 

      if (currLoc == 'restorebatch') { 
       var TimeoutId = setTimeout(function() {dynamicSearch('restorelookup');}, 400); 
      } else { 
       var TimeoutId = setTimeout(function() {dynamicSearch('orglookup');}, 400); 
      } 

      //alert(TimeoutID); 
      TimeoutBag[GetCounter] = { 
       'RequestNumber': GetCounter, 
       'TimeoutId': TimeoutId 
      } 
     } 
    } 
); 

function clearTimeouts(TimeoutBagKeys) //TimeoutBagKeys is an array that contains keys into the TimeoutBag of Timeout's you want to clear 
{ 
    if(TimeoutBagKeys == null) //if TimeoutBagKeys is null, clear all timeouts. 
    { 
     for (var i = 0; i < TimeoutBag.length; i++) 
     { 
      if (TimeoutBag[i] != null) { 
      clearTimeout(TimeoutBag[i].TimeoutId); 
      } 
     } 
    } 
    else //otherwise, an array of keys for the timeout bag has been passed in. clear those timeouts. 
    { 
     var ClearedIdsString = ""; 
     for (var i = 0; i < TimeoutBagKeys.length; i++) 
     { 
      if (TimeoutBag[TimeoutBagKeys[i]] != null) 
      { 
       clearTimeout(TimeoutBag[TimeoutBagKeys[i]].TimeoutId); 
       ClearedIdsString += TimeoutBag[TimeoutBagKeys[i]].TimeoutId; 
      } 
     }   
    } 
} 
function dynamicSearch(viewname) { 

     $(".lookup_info").slideUp(); 


     if ($("#id_JobID").val().length >= 3) { 
      var orgLookupUrl = "/deposits/" + viewname + "/?q=" + $("#id_JobID").val(); 
       getBatchInfo(orgLookupUrl); 

     } 
     else if ($("#id_JobID").val().length == 0) { 
      $("#loadimg").attr("src", "/static/icons/blank.gif"); 
      $(".lookup_info").slideUp(); 
     } 
     else { 
      $("#loadimg").attr("src", "/static/icons/loading.gif"); 
      $(".lookup_info").slideUp(); 
     } 
} 
function getBatchInfo(orgLookupUrl) { 
       $.get(orgLookupUrl, function(data){ 
        if (data == "False") { 
         $("#loadimg").attr("src", "/static/icons/red_x.png"); 
         $(".lookup_info").html("No batch found - creating new batch."); 
         $("#lookup_submit").val("Create"); 
         $(".lookup_info").slideDown(); 
         toggleDepInputs("on"); 
        } 
        else { 
         $("#loadimg").attr("src", "/static/icons/green_check.png"); 
         $("#lookup_submit").val("Submit"); 
         $(".lookup_info").html(data); 
         $(".lookup_info").slideDown() 
         toggleDepInputs("off"); 
        }; 
       }); 
} 

回答

0

您需要使每個請求的URL都是唯一的。失敗的方法是引入新的GET參數,其中有一個時間戳作爲它的值 - 因此URL對於每個請求都是唯一的,因爲時間戳總是在變化,所以IE無法緩存它。

url = "/deposits/orglookup/?q=123&t=" + new Date().getTime() 

所以不是隻有一個參數(q),你現在有兩個(qt),但因爲服務器通常不關心回合額外的參數,然後它的一切權利

1

有三種解決這個:

要麼

  • 使用.post的$,而不是$不用彷徨
  • 爲您的網址添加一個隨機GET參數,例如?「更新= 10202203930489」(當然,它需要不同的每個請求)
  • 或通過發送正確的報頭(if-modified-since
0

一個技巧,往往工作原理是追加禁止在服務器端緩存作爲查詢字符串參數的查詢url的時間戳,從而在每次發出請求時都會生成一個唯一的url。

VAR orgLookupUrl = 「/存款/」 + 視圖名+ 「/ Q =」 + $( 「#id_JobID」)。VAL()+ 「&時間=」 +新的Date()。的getTime ();;