2012-01-19 14 views

Odpowiedz

0

Próbowałeś czegoś takiego?

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

Edit

myślę, że może być zatrzymany z somthing brzydki jak ten

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

Dobry pomysł! Jednak zauważyłem, że mobilne safari na iOS 4.2 ma już "częściową" obsługę xhr2, która łączy XMLHttpRequestUpload, ale nie responseType = "arraybuffer". Odpowiednio zaktualizuję pytanie. –

+0

Podobno żadne wyjątki nie są uruchamiane, gdy parametr responseType ma wartość nieobsługiwaną. –

+0

Przepraszam, przetestowałem to za pomocą konsoli Google Chrome i zadziałało. (funkcja IsArrayBufferSupported() {var XHR = new XMLHttpRequest(); xhr.open ('get', '/', true); try { XHR.responseType = "arraybuffer"; return true; } zaczep (e) {zwraca fałsz;} })() > prawda (funkcja IsArrayBufferSupported() { var XHR = nowy XMLHttpRequest(); xhr.open ('GET', '/' prawda); try { xhr.responseType = "badarg"; return true; } catch (e) {return false;} })() > false –

2

sprawdzanie ArrayBuffer powinien być dobry wykrywanie cecha.

Jeśli userAgent obsługuje obiekt ArrayBuffer to prawdopodobnie będzie pracować z XHR2

Jednak jak zauważył, że najlepiej byłoby zrobić test funkcji, a nie funkcja wykrywania.

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

Podobno żadne wyjątki nie są uruchamiane, gdy parametr responseType ma wartość nieobsługiwaną. –

+0

@AronWoost Nie oczekiwałbym zwolnienia od wyjątku, stąd kontrola typu zwrotu. Jednak dla przyszłego kodu sprawdzającego warto użyć polecenia "try catch", jeśli jakakolwiek inna userAgent zgłasza wyjątek. – Raynos

10

Używam następujący:

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

we wszystkich przeglądarkach testowałem obsługujących tę wartość domyślna responseType jest pusty ciąg znaków (tak jak jest napisane w specyfikacji: http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute) w przeglądarkach, które nie obsługują responseType, wartość atrybutu jest niezdefiniowana.

+2

To wydaje się być dobrym testem. Dla systemu Android 2.3 otrzymuję "undefined", dla Androida 4.x otrzymuję "ciąg". Co odpowiada ładnie z http://caniuse.com/xhr2 (Podobnie jak iOS 4.2, Android 2.3 wydaje się mieć obsługę XMLHttpRequestUpload, lub przynajmniej 'typeof (XMLHttpRequestUpload)' zwraca "funkcję", a nie "niezdefiniowane") –

1

Set responseType do "arraybuffer" i sprawdzić, czy dostał nową wartość:

// 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

It fail for IE6 ponieważ nie sprawdzasz, czy 'responseType' jest obsługiwane. – Hydro

0

Korzystanie modernizr ten jest objęty Modernizr.xhr2. Kontynuacja komentarzy dotyczących częściowego wsparcia Modernizr.dataview może być jeszcze dokładniejsza.

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

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

Oczekuję, że obie funkcje będą obsługiwane, czy nie.

0

Jeśli chcesz tylko sprawdzić, czy odpowiedź "arraybuffer" jest obsługiwana, po prostu sprawdź, czy znajduje się w obiekcie globalnym. Jeśli chcesz wykryć inne funkcje, po prostu przydziel XHR().responseType, dopóki przeglądarka nie opróżni go lub nie wyśle ​​błędu.

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