2012-01-19 29 views

Trả lời

0

Bạn đã thử một cái gì đó như thế này chưa?

if(typeof(XMLHttpRequestUpload) == "undefined"){ 
    //not supported 
} 

Sửa

Tôi nghĩ rằng bạn có thể bị mắc kẹt với somthing khó chịu như thế này

function IsArrayBufferSupported(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', '/', true); 
    try{ 
     xhr.responseType = "arraybuffer"; 
     return true; 
    }catch(e){return false;} 
} 
+0

Ý tưởng hay! Tuy nhiên, tôi chỉ nhận thấy rằng, safari di động trên iOS 4.2 đã có hỗ trợ xhr2 "một phần", mà các đường nối để bao gồm XMLHttpRequestUpload nhưng không phải responseType = "arraybuffer". Tôi sẽ cập nhật câu hỏi cho phù hợp. –

+0

Dường như không có trường hợp ngoại lệ nào được kích hoạt khi responseType đặt giá trị không được hỗ trợ. –

+0

Xin lỗi, đã kiểm tra điều này với bảng điều khiển google chrome và nó hoạt động. (chức năng IsArrayBufferSupported() {var XHR = new XMLHttpRequest(); xhr.open ('GET', '/', true); try { XHR.responseType = "arraybuffer"; trả về true; } catch (e) {return false;} })() > true (chức năng IsArrayBufferSupported() {var XHR = new XMLHttpRequest(); xhr.open ('GET', '/', true); try { xhr.responseType = "badarg"; return true; } catch (e) {return false;} })() > sai –

2

Kiểm tra của ArrayBuffer phải là một phát hiện tính năng tốt.

Nếu một UserAgent hỗ trợ các đối tượng ArrayBuffer sau đó nó có khả năng nó sẽ làm việc với XHR2

Tuy nhiên như đã nói, nó sẽ là tốt nhất để làm một thử nghiệm tính năng và không phải là một phát hiện tính năng.

function IsArrayBufferSupported(cb){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', '/', true); 
    try { 
     xhr.responseType = "arraybuffer"; 
    } catch (e){ 
     return cb(false); 
    } 
    xhr.onload = function onload() { 
     if (ArrayBuffer.prototype.isPrototypeOf(this.response)) { 
      return cb(true); 
     } 
     cb(false); 
    } 
    xhr.send(); 
} 
+1

Dường như không có ngoại lệ nào được kích hoạt khi responseType đặt giá trị không được hỗ trợ. –

+0

@AronWoost Tôi hy vọng sẽ không có ngoại lệ nào được kích hoạt, do đó kiểm tra kiểu trả về. Tuy nhiên đối với mã kiểm soát trong tương lai, nó có giá trị để sử dụng 'try catch' trong trường hợp bất kỳ userAgent khác ném một ngoại lệ – Raynos

10

Tôi đang sử dụng như sau:

var supported = typeof new XMLHttpRequest().responseType === 'string'; 

Trong tất cả các trình duyệt Tôi đã thử nghiệm rằng sự hỗ trợ này, giá trị mặc định của responseType là một chuỗi rỗng (giống như nó nói trong spec: http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute), trong các trình duyệt không hỗ trợ responseType, giá trị của thuộc tính không được xác định.

+2

Điều này có vẻ là một thử nghiệm tốt. Đối với Android 2.3 tôi nhận được "không xác định", cho Android 4.x tôi nhận được "chuỗi". Tương ứng với http://caniuse.com/xhr2 (Giống như iOS 4.2, Android 2.3 dường như có hỗ trợ XMLHttpRequestUpload hoặc ít nhất 'typeof (XMLHttpRequestUpload)' trả về "chức năng", không phải "không xác định") –

1

Set responseType để "arraybuffer" và kiểm tra xem nó có giá trị mới:

// call like isResponseTypeSupported('arraybuffer') 
function isResponseTypeSupported(responseType) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', '/'); 
    try { 
     xhr.responseType = responseType; 
    } catch (e) { 
     return false; 
    } 
    return xhr.responseType === responseType; 
} 
+0

Không thành công cho IE6 vì bạn không kiểm tra xem 'responseType' có được hỗ trợ hay không. – Hydro

0

Sử dụng Modernizr này được bảo vệ dưới Modernizr.xhr2. Theo dõi các nhận xét về hỗ trợ một phần Modernizr.dataview thậm chí có thể chính xác hơn.

(function(modernizr, ns){ 
    ns.isSupported = (function(){ 
     return modernizr.xhr2 && modernizr.dataview; 
    }); 

    return ns; 
}(window.Modernizr, window.NameSpace || {})); 

Tôi mong đợi cả hai tính năng đều được hỗ trợ hay không.

0

Nếu bạn chỉ muốn phát hiện nếu đáp ứng "arraybuffer" được hỗ trợ, chỉ cần kiểm tra xem nó có trong đối tượng chung không. Nếu bạn muốn phát hiện các tính năng khác chỉ cần gán XHR().responseType cho đến khi trình duyệt trống "" hoặc ném lỗi.

function isAjaxResponseSupported(type) { 
    var xhr = new XMLHttpRequest; 

    /* Check if .responseType is supported first */ 
    if (typeof xhr.responseType === 'string') { 

     /* Some browsers throw error for invalid .responseType */ 
     try { 
      xhr.responseType = type; 
      // If they don't, 
      // check if .responseType is equal to @type. 
      return xhr.responseType === type; 
     } catch (e) { 
      return false; 
     } 

    ; else return false;   
} 
Các vấn đề liên quan