2017-04-25 68 views
0

我在我的Django模板下面的Ajax請求:Ajax的請求在Django

$('#subjects').on('change', function() { 

    var subject = $('#subjects').find(":selected").text(); 

    $.ajax({ 
     type: "GET", 
     url: "/classes/" + term + "/" + subject , // or just url: "/my-url/path/" 
     dataType: "html", 
     success: function(data) { 
      $('#classes').html(data); 
     } 
    }); 

    //remove courses 
    //remove overview 

    //get courses for specified subject 
    //put them under course 
}); 

的 「主題」 id是一個選擇的形式是這樣的:

<select size="7" class="form-control" id="subjects"> 
    {% for subject in subjects %} 
    <option>{{ subject }}</option> 
    {% endfor %} 
</select> 

所以,當主題發生了變化,我向服務器發送ajax請求,以便從數據庫中獲取該主題的類(因爲有數千個類)。但是,這需要1秒。如果用戶只是簡單地列出了我的主題列表,那麼幾秒鐘內會發出幾十個Ajax請求,導致備份並放慢正常顯示的數據速度。

我試着在發送另一個請求之前中止所有以前的ajax請求,但問題是服務器仍然會處理這些請求,所以它沒有解決問題。

有什麼辦法可以加快速度,不知何故,只要用戶滾動到某個主題,只需要1秒鐘?或者,有沒有人會推薦另一種方法?

跟進問題。我剛想到的另一種方法是僅在選擇選項超過1秒時才發送ajax請求。這會使它花費2秒鐘,這很好。有沒有辦法做到這一點?

回答

1

回答到你的跟進問題,這裏是一個jQuery的功能,允許延遲事件的回調毫秒一定量:

(function ($) { 
    $.fn.delayOnEvent = function(onevent, callback, ms){ 
     $(this).on(onevent, function(event){ 
      var srcEl = event.currentTarget; 
      if(srcEl.delayTimer) 
       clearTimeout (srcEl.delayTimer); 
      srcEl.delayTimer = setTimeout(function(){ callback($(srcEl)); }, ms); 
     }); 
     return $(this); 
    }; 
})(jQuery); 

你可以這樣稱呼你的情況:

$('#subjects').delayOnEvent('change', function() { 
    ... 
    }, 1000); // one second delay 
+0

作品不錯。謝謝! – rishubk

1

做這樣的事情enable/disable

$('#subjects').on('change', function() { 

    var subject = $('#subjects').find(":selected").text(); 
    document.getElementById('subjects').disabled=true 
    $.ajax({ 
     type: "GET", 
     url: "/classes/" + term + "/" + subject , // or just url: "/my-url/path/" 
     dataType: "html", 
     success: function(data) { 
      $('#classes').html(data); 
      document.getElementById('subjects').disabled=false 
     } 
    }); 

#rest of code