如何特征检测XMLHttpRequest是否支持responseType=“”;阵列缓冲器”;
How to feature detect if XMLHttpRequest supports responseType = "arraybuffer"?
我想知道浏览器是否支持XMLHttpRequest.responseType = "arraybuffer"
。问题是,我不能再次测试一些"通用"xhr2支持,因为iOS 4.2有部分xhr2的支持,其中包括(即)XMLHttpRequestUpload
,但不包括responseType = "arraybuffer"
。
我正在使用以下内容:
var supported = typeof new XMLHttpRequest().responseType === 'string';
在我测试的所有支持此功能的浏览器中,responseType的默认值都是一个空字符串(就像规范中所说的那样:http://www.w3.org/TR/XMLHttpRequest/#the-responsetype属性),在不支持responsetype的浏览器中,该属性的值是未定义的。
检查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();
}
将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;
}
你试过这样的东西吗?
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;}
}
使用Modernizr这在Modernizr.xhr2
中有介绍。跟进关于部分支持Modernizr.dataview的评论可能会更准确。
(function(modernizr, ns){
ns.isSupported = (function(){
return modernizr.xhr2 && modernizr.dataview;
});
return ns;
}(window.Modernizr, window.NameSpace || {}));
我希望这两个功能都能得到支持或不支持。
如果您只想检测是否支持"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;
}
相关文章:
- 使用正则表达式捕获“”并分割成阵列
- AngularJS卡片转盘:将卡片返回到阵列的末尾
- 从不同的对象创建阵列
- 阵列中随机图像的问题
- 在特定条件下从存储在localStorage中的阵列中删除对象
- 如何将所有同级存储在动态本地存储阵列中
- 从localStorage添加和检索阵列
- angular.注射器阵列值未返回当前值
- 流星蒙戈的返回阵列
- 从2D RGB阵列创建图像
- 构建画布RGB值的2D阵列
- 图像阵列预加载时显示沙漏光标
- 当会话存储阵列中存在大量元素时,如何从中删除元素
- 相对于角度控制器中的另一个阵列过滤阵列项目
- 为什么不是't我的“;虚拟的“;阵列工作
- Json阵列的详细信息显示在三页的angularjs中
- 来自阵列的大小为N的组合
- 用替换或拼接替换阵列中的编号
- d3中的过滤阵列
- 如何特征检测XMLHttpRequest是否支持responseType=“”;阵列缓冲器”;