2013-01-31 28 views
5

Đối với một số dynamic page, tôi sử dụng Ajax Long Polling và thậm chí với jQuery 1.9, Internet Explorer bị treo sau yêu cầu đầu tiên.

Mã kịch bản được dựa trên bài viết Simple Long Polling Example with JavaScript and jQuery

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function(){ 
    (function poll(){ 
     $.ajax({ url: "ajaxstats.json", success: function(data){ 
     $("button.requests").empty().append(data.requests); 
    }, dataType: "json", complete: poll, timeout: 30000 }); 
    })(); 
    }); 
</script> 

Giao diện điều khiển cho thấy không có lỗi.

mạng lưới giám sát Các IE ngay lập tức bộc lộ nhiều yêu cầu đối với tài nguyên ajaxstats.json với một thời gian phản ứng của < 1 ms và mã 304 (not modified) phản ứng. Nội dung phản hồi là chính xác (mã JSON).

Mã máy chủ luôn trì hoãn câu trả lời bằng 1000 mili giây. Và trong Firefox, nhật ký Firebug XHR cho thấy mọi yêu cầu mất khoảng 1000 mili giây, như mong đợi.

Các mã phản hồi HTTP là khác nhau giữa Firefox và Internet Explorer:

  • trong Firefox: mã phản hồi là 200 ok
  • trong Internet Explorer 9, các mã phản hồi là 304 (not modified)

Có một cách để làm việc xung quanh vấn đề này IE?

+1

bất kỳ lỗi nào trong bảng điều khiển? lưu lượng truy cập http thì sao? – jbabey

+0

@jbabey xem chỉnh sửa của tôi, tôi sẽ cập nhật nó với những phát hiện của tôi trong Firefox – mjn

+0

Bạn đã xóa bộ nhớ cache của mình chưa? Bạn đang thực hiện một yêu cầu GET sẽ lưu lại câu trả lời http. Đặt tùy chọn bộ nhớ cache cho cuộc gọi ajax nếu bạn muốn jQuery thêm tham số truy vấn chuỗi truy vấn bộ nhớ cache vào cuộc gọi. – epascarello

Trả lời

7

Thử đặt tham số bộ nhớ cache thành sai, nếu được đặt thành false, nó sẽ buộc trình duyệt yêu cầu các trang được yêu cầu.

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function(){ 
    (function poll(){ 
     $.ajax({ url: "ajaxstats.json", success: function(data){ 
     $("button.requests").empty().append(data.requests); 
    }, dataType: "json", complete: poll, timeout: 30000, cache: false }); 
    })(); 
    }); 
</script> 
3

Sử dụng phiên bản setTimeout trên bài viết. Tùy chọn timeout đặt thời gian chờ cho yêu cầu, không phải là thời gian chờ cho đến khi yêu cầu tiếp theo.

Có một số reply để nhận xét từ Lars, nơi tác giả đề xuất điều đó.

+0

+1 - câu trả lời khác cũng hoạt động tốt - khó nói là cái nào là "tốt nhất" – mjn

+0

Trong thực tế, tôi nghĩ bạn có hai vấn đề: người ta nhận được phản hồi được lưu trữ, có lẽ quá nhanh và IE không làm như vậy t dường như xử lý nó đúng cách, bắt đầu yêu cầu tiếp theo ngay lập tức. Vấn đề khác là cách bạn muốn bỏ phiếu dài của bạn để làm việc: cách nó được, nó không phải chờ đợi 30 giây trước khi yêu cầu tiếp theo, những gì bạn có thể thực hiện với phiên bản 'setTimeout'. –

+1

Ý tưởng không đợi 30 giây trước yêu cầu tiếp theo, nhưng để giữ kết nối với máy chủ mở và gọi chức năng thăm dò ý kiến ​​và khởi động lại quá trình bỏ phiếu (mở lại kết nối), ngay khi thực hiện thành công hoặc gọi lại lỗi. – Corneliu

1

Tôi không có câu trả lời hay về lý do IE9 bị treo ngoài thực tế là IE9 chỉ chậm. Nó sẽ liên tục mất mãi mãi để gọi gọi lại của một cuộc gọi ajax. Thử nghiệm tại nơi làm việc, tôi đã nhìn thấy cùng một cuộc gọi ajax chống lại cùng một máy chủ mất hơn 5x thời gian trong IE9 như trong Firefox, mặc dù các trình duyệt đang chạy trên cùng một máy.

Nếu bạn đang xây dựng một ứng dụng thời gian thực và có quyền truy cập vào máy chủ thực tế nó đang chạy trên tôi khuyên bạn nên sử dụng Socket.IO. http://socket.io/ Ban đầu nó được xây dựng cho node.js nhưng hiện nay có các thiết bị phía máy chủ cho hầu hết các ngôn ngữ chính.

Thư viện client có vào mùa thu này lại theo thứ tự:

  • WebSocket
  • Adobe Flash Ổ cắm
  • AJAX dài bỏ phiếu
  • AJAX nhiều phần dữ liệu trực tuyến
  • Vô hạn khung nội tuyến
  • JSONP Polling

Trên các trình duyệt mới hơn, bạn có được hiệu suất ổ cắm web thực sự, trên các trình duyệt không hỗ trợ nó, bạn sẽ nhận được phiếu thăm dò ý kiến ​​miễn phí nhưng bạn chỉ có thể coi nó như một ổ cắm web sử dụng cùng giao diện Socket.IO.

+0

Chỉ là lời nhắc. Nếu bạn đang sử dụng một số SO với bộ nhớ đệm của thư viện như Windows Vista trở lên, khi sử dụng một chương trình mà bạn từng sử dụng, bạn sẽ nhận được một hiệu suất tăng lên, bởi vì các thư viện cần thiết đã được lưu vào bộ nhớ. – rcdmk

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