如何检测XMLHttpRequest是否支持responseType =“arraybuffer”?

时间:2012-01-19 13:07:42

标签: javascript html html5 w3c

我想知道浏览器是否支持XMLHttpRequest.responseType = "arraybuffer"。问题是,我无法再次测试一些“一般”xhr2支持,因为iOS 4.2具有部分xhr2支持,包括(即)XMLHttpRequestUpload但不包括responseType = "arraybuffer"

6 个答案:

答案 0 :(得分:10)

我使用以下内容:

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

在我测试的所有支持此功能的浏览器中,responseType的默认值为空字符串(就像在规范中所述:http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute),在不支持responseType的浏览器中,属性的值未定义。

答案 1 :(得分:2)

检查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();
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你尝试过这样的事吗?

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

答案 4 :(得分:0)

使用Modernizr,Modernizr.xhr2涵盖了这一点。 对有关部分支持Modernizr.dataview的评论进行跟进可能会更加准确。

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

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

我希望这两个功能都得到支持。

答案 5 :(得分:0)

如果您只想检测是否支持"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;        
}