2012-02-06 34 views
6

Tôi đang cố gắng triển khai bỏ phiếu dài bằng Netty và jQuery.Thăm dò ý kiến ​​lâu dài - Sự cố với Internet Explorer 8

Tôi hoạt động chính xác với Chrome và Firefox, nhưng Internet Explorer 8 đang gây ra sự cố cho tôi.

Tôi đang thực thi mã sau gửi yêu cầu đến máy chủ của tôi, đợi cho đến khi nhận được phản hồi từ máy chủ và sau đó gửi một yêu cầu khác.

function longPollRequest() { 
    $.ajax({ 
     url: '/test-path', 
     type: 'GET', 
     success: function(data, textStatus, jqXHR) { 
      longPollRequest(); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

Tuy nhiên, trong IE8, tôi đang chạy vào vòng lặp vô hạn, đóng băng trình duyệt. Phần thú vị là máy chủ của tôi chỉ nhận được yêu cầu đầu tiên từ IE. Tôi thực sự bối rối về những gì đang xảy ra. Nếu bất cứ ai có bất kỳ ý tưởng tôi thực sự sẽ đánh giá cao sự giúp đỡ.

+1

Dòng đầu tiên phải là 'hàm longPollRequest() {' thay thế. Đó có phải chỉ là lỗi đánh máy trong bài viết của bạn không? – Jacob

+3

Tôi đặt cược IE8 lưu trữ yêu cầu của bạn: Bạn đã thử 'url: '/ test-path? Nocache =' + (Math.random * 900000 + 100000) .toString() –

+0

@Jocob Ya đó chỉ là lỗi đánh máy. Đã sửa. –

Trả lời

9

Disable bộ nhớ đệm và xem nếu điều này khắc phục vấn đề của bạn:

function longPollRequest() { 
    $.ajax({ 
     url  : '/test-path', 
     type : 'GET', 
     cache : false, 
     success : function(data, textStatus, jqXHR) { 
      longPollRequest(); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

Điều này sẽ buộc jQuery để thêm một thời gian tem cho mỗi yêu cầu. Nếu phản hồi được lưu trữ thì nó sẽ trở lại rất nhanh và có một cơ hội tốt đó là những gì gây ra vòng lặp vô hạn của bạn.

Bạn cũng có thể buộc một sự chậm trễ tối thiểu giữa các yêu cầu AJAX:

var lastRequestTime = 0; 
function longPollRequest() { 
    $.ajax({ 
     url  : '/test-path', 
     type : 'GET', 
     cache : false, 
     success : function(data, textStatus, jqXHR) { 
      var delay = ((new Date().getTime()) - lastRequestTime); 
      if (delay > 1000) { 
       delay = 0; 
      } else { 
       delay = (1000 - delay); 
      } 
      setTimeout(longPollRequest, delay); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

này sẽ kiểm tra thời điểm hiện tại so với thời điểm yêu cầu AJAX ngoái. Nếu nó dài hơn một giây thì chỉ cần chạy lại hàm mà không có sự chậm trễ, nếu không, hãy chờ mã cho đến khi một giây trôi qua giữa các yêu cầu. Có lẽ một cách thanh lịch hơn để xác định biến số delay nhưng mã trên sẽ giúp bạn bắt đầu.

+3

Tuyệt vời, giải pháp của bạn hoạt động. Cám ơn đã chỉ tôi hướng đi đúng. Cuối cùng tôi đã chỉ định tiêu đề phản hồi Cache-Control: no-cache cho tất cả các phản hồi bỏ phiếu dài và nó cũng đang hoạt động. –

Các vấn đề liên quan