Voglio sapere se il browser supporta XMLHttpRequest.responseType = "arraybuffer"
. Il problema è che non posso testare nuovamente il supporto "generale" xhr2, dal momento che iOS 4.2 ha un supporto xhr2 parziale che include (cioè) XMLHttpRequestUpload
ma non responseType = "arraybuffer"
.Come rilevare la funzionalità se XMLHttpRequest supporta responseType = "arraybuffer"?
risposta
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;}
}
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();
}
Apparentemente non viene emessa alcuna eccezione quando responseType è impostato su un valore non supportato. –
@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
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.
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") –
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;
}
Fallisce per IE6 dal momento che non si controlla se 'responseType' è supportato. – Hydro
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.
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;
}
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. –
Apparentemente non viene emessa alcuna eccezione quando responseType è impostato su un valore non supportato. –
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 –