2017-04-25 126 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