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