2012-01-19 10 views

Respuesta

0

¿Has probado algo como esto?

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

Edición

Creo que puede ser pegado con somthing desagradable como esto

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

¡Buena idea! Sin embargo, acabo de notar que ese safari móvil en iOS 4.2 ya tiene soporte xhr2 "parcial", que parece incluir XMLHttpRequestUpload pero no responseType = "arraybuffer". Actualizaré la pregunta en consecuencia. –

+0

Aparentemente, no se activan excepciones cuando responseType se establece en un valor no admitido. –

+0

Lo siento, probé esto con la consola Google Chrome y funcionó. (función IsArrayBufferSupported() { var xhr = new XMLHttpRequest(); xhr.open ('GET', '/', true); try { xhr.responseType = "arraybuffer"; return true; } catch (e) {return false;} })() > cierto (función IsArrayBufferSupported() {var xhr = new XMLHttpRequest(); xhr.open ('GET', '/', la verdadera); try { xhr.responseType = "badarg"; return true; } catch (e) {return false;} })() > false –

2

Comprobación de ArrayBuffer debe ser una buena detección de características.

Si un userAgent es compatible con el objeto ArrayBuffer entonces es probable que trabajará con XHR2

Sin embargo, como se ha señalado, lo mejor sería hacer una prueba de función y no una función de detección.

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

Aparentemente, no se activan excepciones cuando responseType se establece en un valor no admitido. –

+0

@AronWoost Esperaría que no se disparara ninguna excepción, de ahí la verificación del tipo de devolución. Sin embargo, para el futuro código de prueba, es valioso usar 'try catch' en caso de que cualquier otro userAgent arroje una excepción – Raynos

10

Estoy utilizando el siguiente:

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

En todos los navegadores que probé que el apoyo de esto, el valor por defecto de responseType es una cadena vacía (como se dice en la especificación: http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute), en navegadores que no admiten responseType, el valor del atributo no está definido.

+2

Esto parece una buena prueba. Para Android 2.3 me sale "indefinido", para Android 4.x obtengo "cadena". Que se corresponde muy bien con http://caniuse.com/xhr2 (como IOS 4.2, Android 2.3 parece tener el apoyo XMLHttpRequestUpload, o al menos "función" 'typeof (XMLHttpRequestUpload)' regresa, no "indefinido") –

1

Conjunto responseType a "arraybuffer" y comprobar si tiene el nuevo valor:

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

fracasar para IE6 ya que no verifica si 'responseType' es compatible. – Hydro

0

El uso de este Modernizr está cubierto por Modernizr.xhr2. El seguimiento de los comentarios sobre el soporte parcial Modernizr.dataview podría ser aún más preciso.

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

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

Espero que ambas características sean compatibles o no.

0

Si solo desea detectar si la respuesta "arraybuffer" es compatible, simplemente verifique si está en el objeto global. Si desea detectar otras funciones, simplemente asigne XHR().responseType hasta que el navegador lo vacíe "" o lance un error.

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