2015-06-14 14 views
11

Rất ít các trình duyệt Android bao gồm Samsung trình duyệt mặc định trên các thiết bị cũ sẽ không hỗ trợLàm thế nào để phát hiện một trình duyệt sẽ không hỗ trợ XHR2 Tải lên tiến

xhr.upload.onprogress 

tổ chức sự kiện. Vì vậy, chúng tôi không thể hiển thị tiến trình tải lên theo thời gian thực trên các trình duyệt đó.

Tôi làm cách nào để phát hiện các trình duyệt đó? Vì vậy, tôi có thể thay đổi thiết lập của mình để hiển thị tiến trình.

+1

Bạn có thể đọc các tiêu đề trình duyệt. Mặc dù cá nhân tôi nghĩ rằng nó sẽ là tốt hơn chỉ cần làm 'if (typeof xhr.upload.onprogress === 'undefined')' (hoặc tương tự). Bằng cách này, bạn tránh kiểm tra mọi trình duyệt. –

+0

@EricMartinez nhận được "Đối tượng" trên cả trình duyệt cấp 1 và cấp 2. – Vishnu

+0

xin lỗi, nhận được "null" trên cả trình duyệt cấp 1 và cấp 2. – Vishnu

Trả lời

2

Đơn giản chỉ cần:

var xhr = new XMLHttpRequest(); 
if (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload)) // attach event... 

Vì vậy, nếu bạn muốn có một chức năng:

function supportAjaxUploadProgressEvents() { 
    var xhr = new XMLHttpRequest(); 
    return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload)); 
} 
+0

Vui lòng kiểm tra mã của bạn và đăng mã đầy đủ nếu có thể. – Vishnu

+0

Mã của tôi hoạt động hoàn hảo;)) – fred727

+0

Mã của bạn hoạt động hoàn hảo! hỗ trợ chức năngAjaxUploadProgressEvents() { var xhr = new XMLHttpRequest(); trở lại !! (xhr && ('tải lên' trong xhr) && ('onprogress' trong xhr.upload)); } nếu (! SupportAjaxUploadProgressEvents()) { thông báo ("Tôi chưa bao giờ hỗ trợ xhr2"); } Cảnh báo khác { \t ("Tôi hỗ trợ xhr2"); } – Vishnu

2

hm. đã thử nghiệm một phiên bản Firefox cũ. 3.5.2.

phiên bản đầu tiên có thuộc tính (new XMLHttpRequest).upload.

Phiên bản hiện tại của Chrome:

 
send(1); //progress 1 of 1 
send(40000000_chars); // 1,2 or more progress events. 

Firefox 3.5.2:

 
send(1); //no progress events. 
send(40000000_chars); // some progress events. 

Vì vậy, nếu trình duyệt gửi thời gian ing là không lớn, không có pregress sự kiện trên các trình duyệt cũ.

Nhưng load sự kiện với .loaded == .total được kích hoạt bình thường.


Kết luận hiện tại: dữ liệu được gửi quá nhanh đối với các trình duyệt cũ.

+0

Yea cho các tệp rất nhỏ sẽ không có sự kiện tiến triển nào được thực hiện. nhưng đối với một tệp lớn, ví dụ: tệp 20Mb trên kết nối 512K sẽ mất vài phút để hoàn tất quá trình tải lên, vẫn còn trên trình duyệt cấp 1 sẽ có sự kiện tiến triển Zero. – Vishnu

+0

@Vishnu có thể chạy ở cấp 1 (tập lệnh một dòng): 'alert (" upload: "+ ('upload' trong XMLHttpRequest.prototype) +" XHRET: "+ (XMLHttpRequestEventTarget? True: false) +" PE: "+ (ProgressEvent? True: false))' – befzz

+0

Có True ở cấp 2, nhưng trên chức năng Cấp cảnh báo không được thực hiện hoặc ném một số lỗi, không biết điều gì đang xảy ra. làm thế nào chúng ta có thể gỡ lỗi các trình duyệt? – Vishnu

0

dưới đây đã được thử nghiệm trong FF 3.5.2 trở false, nhưng đối với mới nhất Chrome/FF/IE11 true

Trường hợp ngoại lệ được ném vào việc cố gắng đọc onpgress sau khi được thiết lập.

Hy vọng rằng sẽ giúp,

function isSupported() { 
     var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); 
     try { 
      xhr.upload.onprogress = isSupported; 
      var x = xhr.upload.onprogress; 
      return true; 
     } catch(e) { 
      return false; 
     } 
    } 
Các vấn đề liên quan