2015-06-14 44 views
11

很少的Android瀏覽器,包括舊設備上的默認三星瀏覽器將不支持如何檢測,不會支持XHR2上傳進度

xhr.upload.onprogress 

事件的瀏覽器。所以我們無法在該瀏覽器上顯示實時上傳進度。

如何檢測這些瀏覽器? 所以我可以更改我的設置以顯示進度。

+1

,你可以讀取瀏覽器的標題。雖然我個人認爲只是做'if(typeof xhr.upload.onprogress ==='undefined')'(或類似的)會更好。這樣你可以避免檢查每個瀏覽器。 –

+0

@EricMartinez在level1和level2瀏覽器上都獲得「Object」。 – Vishnu

+0

對不起,在level1和level2瀏覽器上都顯示「null」。 – Vishnu

回答

2

簡單:

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

所以,如果你想有一個函數:

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

如果可能,請測試您的代碼併發布完整代碼。 – Vishnu

+0

我的代碼完美無缺;)) – fred727

+0

您的代碼完美無缺! function supportAjaxUploadProgressEvents(){ var xhr = new XMLHttpRequest(); 回報! (xhr &&('x'上傳')&&(xhr.upload中的'onprogress')); (!supportAjaxUploadProgressEvents()){ } {「我從不支持xhr2」); } else { \t alert(「I support xhr2」); } – Vishnu

2

hm。測試了一個非常古老的Firefox。 3.5.2。第一版有(new XMLHttpRequest).upload屬性。

當前版本的Chrome瀏覽:

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

火狐3.5.2:

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

所以,如果瀏覽器發送荷蘭國際集團的時間並不大,對舊的瀏覽器沒有pregress事件。

load事件與.loaded == .total正常發射。


當前的結論:對於舊瀏覽器,數據發送得太快。

+0

對於非常小的文件,將不會執行進度事件。但對於一個大文件例如:在512K連接上的20Mb文件需要幾分鐘時間才能完成上傳過程,仍然在1級瀏覽器中會出現零進度事件。 – Vishnu

+0

@Vishnu可以運行在1級(單行腳本):'alert(「upload:」+('upload'in XMLHttpRequest.prototype)+「XHRET:」+(XMLHttpRequestEventTarget?true:false)+「PE: 「+(ProgressEvent?true:false))' – befzz

+0

在2級上得到True,但Level Alert函數未執行或拋出一些錯誤,不知道發生了什麼。我們如何調試這些瀏覽器? – Vishnu

0

下在FF 3.5.2測試返回false,但最新的Chrome/FF/IE11 true

拋出異常的努力被設置後讀onpgress

希望幫助,

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; 
     } 
    }