2

このフィドルが投げる理由がわかりません

キャッチされないエラー:InvalidStateError:DOM例外11

function url(){
 return '/echo/js/?js=' + 5 + Math.floor(Math.random()*900);
}

function poll(done){
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
        if(xhr.status === 200 && xhr.readyState === 4){
            var foo = xhr.responseText;
            done(parseInt(foo));
        }
    };
    xhr.open('get',url(),false);
    xhr.send(null);
}

var button = document.querySelector('#poller');
var price = document.querySelector('#price');

button.addEventListener('click', function(){
    poll(function(data){
        price.innerText = data;
    });
},false);
4

1 に答える 1

8

問題は、readyStateが0/1の場合にステータスが利用できないことです。

ifの順序を逆にする必要があります。

if(xhr.readyState === 4 && xhr.status === 200){

仕様では、ゼロを返す必要があるとされています。「状態がUNSENTまたはOPENEDの場合は、0を返し、これらのステップを終了します。」、ただし、何らかの理由で、一部のブラウザはこれを実行します。「状態がOPENEDでない場合、またはsend()フラグが設定されている場合、「InvalidStateError」例外をスローします。」これがsetRequestHeaderが行うことです。また、あなたのコードは、同期リクエストで使用するという奇妙なものです。

したがって、ここでの問題は、仕様にあるようにブラウザがゼロを返さないことです。ifステートメントの順序を変更すると、最初のチェックが失敗するため、ブラウザーはそのポイントに到達できなくなります。

そしてWebKitのバグ

于 2013-03-25T19:25:55.977 に答える