2711

[code]

    function getAudio(aUrl) {
        var deferred = $.Deferred();
        // ajax is not capable of arraybuffer
        var xhr = new XMLHttpRequest();
        xhr.responseType = 'arraybuffer';
        xhr.open('GET', aUrl, true);
    
        // request succeeded
        xhr.onreadystatechange = function() {
            if (
                (xhr.readyState === 4) && 
                (xhr.status === 200) && 
                (xhr.status !== 404)
                ) {
                audioCtx.decodeAudioData(xhr.response, function(buffer) {
                    buf = buffer;
                    return deferred.resolve(true);
                });
            } 
        };
        xhr.onerror = function() {
            return deferred.resolve(false);
        };
        xhr.send();
        return deferred.promise();
    }
    
[/code]

responseTypeが'arraybuffer'のXMLHttpRequestを送るメソッドを作りました。 Chrome,
Safariでは動きます。しかしFirefoxだと 'InvalidStateError: An attempt was made to use an
object that is not, or is no longer, usable' というエラーが出ます。

Mozillaのサイトサンプルでも上記と同じ方法でxhrをリクエストしています。 何が問題でしょうか。

引数aUrlは"<https://api.soundcloud.com/tracks/121818867/stream?client_id=8f474de4d1dedd5a6a4f4cbb60f4e6b8>"
といったものです。（localではない）


CC BY-SA 3.0
2014-12-27T15:36:12.613
2706
2014-12-29T15:54:44.847
2014-12-29T15:54:44.847
5838
5838
question
javascript firefox
XHR responseType = 'arraybuffer' が Firefoxで動かない


次のコード部分

[code]

    xhr.responseType = 'arraybuffer';
    xhr.open('GET', aUrl, true);
    
[/code]

を次のように処理順序を入れ替えて試してみてください。

[code]

    xhr.open('GET', aUrl, true);
    xhr.responseType = 'arraybuffer';
    
[/code]

一時期の仕様案では、`XMLHttpRequest` の state が `OPENED` でない場合に `responseType`
をセットすると`InvalidStateError` を投げるようになっていました。

[現在の仕様案(2014-01-30〜)](http://www.w3.org/TR/2014/WD-
XMLHttpRequest-20140130/#the-responsetype-attribute)では state が `LOADING` か
`DONE` の場合に `InvalidStateError` を投げるようになっています。

> When set: throws an "InvalidStateError" exception if the state is LOADING or
> DONE.

最新の仕様案と Firefox の実装が異なるということだと思います。


CC BY-SA 3.0
2014-12-27T16:32:41.317
2711
2014-12-27T17:03:30.047
2014-12-27T17:03:30.047
3158
3158
2706
answer