2012-01-19 23 views
8

ブラウザがXMLHttpRequest.responseType = "arraybuffer"をサポートしているかどうかを知りたい。問題は、iOS 4.2には部分的なxhr2サポートが含まれています(つまり、XMLHttpRequestUploadは含まれていますが、responseType = "arraybuffer"は含まれていないため、一部の一般的なxhr2サポートを再度テストすることはできません)。XMLHttpRequestがresponseType = "arraybuffer"をサポートするかどうかを検出する方法は?

答えて

0

あなたはこれを試しましたか?

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

編集

私はあなたがArrayBufferのこの

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

いいアイデア!しかし、私は、iOS 4.2のモバイルSafariにはXMLHttpRequestUploadが含まれていて、responseType = "arraybuffer"は含まれていない、部分的なxhr2サポートが既に存在していることに気付きました。私はそれに応じて質問を更新します。 –

+0

responseTypeがサポートされていない値に設定されている場合、例外は発生しません。 –

+0

申し訳ありません、Google Chromeのコンソールでこれをテストしてみました。 (機能IsArrayBufferSupported(){ するvar XHR =新しいXMLHttpRequestを(); xhr.open( '/'、 'GET'、TRUE); 試み{ XHR。responseType = "arraybuffer"; がtrueを返します。 }キャッチ(E){falseを返す;} })() >真 (関数IsArrayBufferSupported(){ VaRのXHRが=新規のXMLHttpRequest(); xhr.open( 'GET'、 '/'、真); 試み{ xhr.responseType = "badarg"; リターンはtrue、 }キャッチ(電子){falseを返す;}} )() >偽 –

2

チェックが良い特徴検出する必要がありますのような厄介な気にいらで立ち往生するかもしれないと思います。

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

responseTypeがサポートされていない値に設定されている場合は、例外は発生しません。 –

+0

@AronWoost私は例外が発生しないことを期待しています。したがって、戻り値の型チェックです。しかし、将来の校正コードでは、他のuserAgentが例外をスローする場合に 'try catch'を使用することは価値があります。 – Raynos

10

私はそのサポートにこれをテストしたすべてのブラウザで
var supported = typeof new XMLHttpRequest().responseType === 'string'; 

、responseTypeのデフォルト値は空の文字列(それは仕様で述べているだけのよう:http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute)です、 responseTypeをサポートしていないブラウザでは、属性の値は未定義です。

+2

これは良いテストのようです。 Android 2.3では「未定義」、Android 4.xでは「文字列」を取得します。これは、http://caniuse.com/xhr2とよく似ています(iOS 4.2のように、Android 2.3はXMLHttpRequestUploadをサポートしているようです)、少なくとも "typeof(XMLHttpRequestUpload)"は "未定義"ではなく "function"を返します) –

1

設定"arraybuffer"responseType、それが新たな価値を持っているかどうかを確認:

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

IE6 'responseType'がサポートされているかどうかをチェックしないからです。 – Hydro

0

Modernizrを使用したが、これはModernizr.xhr2の下で覆われています。 部分的なサポートについてのコメントをフォローアップModernizr.dataviewさらに正確かもしれません。

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

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

私は両方の機能がサポートされることを期待しています。

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;   
} 
関連する問題