2012-01-19 11 views

risposta

0

Hai provato qualcosa del genere?

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

Modifica

Penso che potrebbe essere bloccato con somthing brutto come questo

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

Buona idea! Tuttavia, ho appena notato che il safari mobile su iOS 4.2 ha già un supporto xhr2 "parziale", che include XMLHttpRequestUpload ma non responseType = "arraybuffer". Aggiornerò la domanda di conseguenza. –

+0

Apparentemente non viene emessa alcuna eccezione quando responseType è impostato su un valore non supportato. –

+0

Siamo spiacenti, ho provato questo con la console di Google Chrome e ha funzionato. (funzione IsArrayBufferSupported() {var XHR = new XMLHttpRequest(); xhr.open ('GET', '/', true); try { XHR.responseType = "arraybuffer"; return true; } catch (e) {return false;} })() > true (funzione IsArrayBufferSupported() {var XHR = new XMLHttpRequest(); xhr.open ('GET', '/', vero); try { xhr.responseType = "badarg"; return true; } catch (e) {return false;} })() > false –

2

Controllo di ArrayBuffer dovrebbe essere una buona funzione di rilevamento.

Se un userAgent supporta l'oggetto ArrayBuffer allora è probabile che possa funzionare con XHR2

Tuttavia, come detto, sarebbe meglio fare un test funzione e non una funzione di rilevamento.

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

Apparentemente non viene emessa alcuna eccezione quando responseType è impostato su un valore non supportato. –

+0

@AronWoost Mi aspetto che non venga emessa alcuna eccezione, quindi il controllo del tipo restituito. Tuttavia, per il codice di proofing futuro è utile utilizzare 'try catch' nel caso in cui un altro utenteAgent generi un'eccezione – Raynos

10

Sto usando il seguente:

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

In tutti i browser che ho provato che supportano questa, il valore predefinito di responseType è una stringa vuota (proprio come si dice nelle specifiche: http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute), nei browser che non supportano responseType il valore dell'attributo non è definito.

+2

Questo sembra un buon test. Per Android 2.3 ottengo "indefinito", per Android 4.x ottengo "stringa". Che corrisponde perfettamente a http://caniuse.com/xhr2 (Come iOS 4.2, Android 2.3 sembra avere il supporto XMLHttpRequestUpload, o almeno 'typeof (XMLHttpRequestUpload)' restituisce "function", non "undefined") –

1

Set responseType a "arraybuffer" e verificare se ha ottenuto il nuovo valore:

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

Fallisce per IE6 dal momento che non si controlla se 'responseType' è supportato. – Hydro

0

Utilizzando Modernizr questo è coperto da Modernizr.xhr2. Il seguito dei commenti relativi al supporto parziale Modernizr.dataview potrebbe essere ancora più accurato.

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

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

Mi aspetto che entrambe le funzioni siano supportate o meno.

0

Se si desidera rilevare se la risposta "arraybuffer" è supportata, è sufficiente verificare se si trova nell'oggetto globale. Se vuoi rilevare altre funzionalità, assegna semplicemente lo XHR().responseType finché il browser non lo svuota "" o genera un errore.

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