Как определить, поддерживает ли XMLHttpRequest responseType = "arraybuffer"? - PullRequest
8 голосов
/ 19 января 2012

Я хочу знать, поддерживает ли браузер XMLHttpRequest.responseType = "arraybuffer". Проблема в том, что я не могу протестировать еще какую-то «общую» поддержку xhr2, поскольку iOS 4.2 имеет частичную поддержку xhr2, которая включает (т.е.) XMLHttpRequestUpload, но не responseType = "arraybuffer".

Ответы [ 6 ]

10 голосов
/ 26 июля 2012

Я использую следующее:

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

Во всех протестированных мной браузерах, которые поддерживают это, значением по умолчанию responseType является пустая строка (как сказано в спецификации: http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute), в браузерах, которые не поддерживают responseType, значение атрибута не определено.

2 голосов
/ 19 января 2012

Проверка ArrayBuffer должна быть хорошим обнаружением функции.

Если userAgent поддерживает объект ArrayBuffer, то, скорее всего, он будет работать с XHR2

Однако, как уже отмечалось, было бы лучше провести тестирование функции, а не обнаружение функции.

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 голос
/ 29 января 2013

Установите responseType на "arraybuffer" и проверьте, получило ли оно новое значение:

// 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 голосов
/ 05 сентября 2016

Если вы просто хотите определить, поддерживается ли ответ "arraybuffer", просто проверьте, находится ли он в глобальном объекте.Если вы хотите обнаружить другие функции, просто присвойте XHR().responseType до тех пор, пока браузер не очистит его "" или не выдайте ошибку.

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;        
}
0 голосов
/ 17 февраля 2016

Используя Modernizr, это покрывается Modernizr.xhr2. Вслед за комментариями относительно частичной поддержки Modernizr.dataview может быть даже более точным.

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

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

Я ожидаю, что обе функции будут поддерживаться или нет.

0 голосов
/ 19 января 2012

Вы пробовали что-то подобное?

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

Редактировать

Я думаю, что вы, возможно, застряли с чем-то противным, как это

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