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 并终止这些步骤。” ,但由于某种原因,某些浏览器会执行此操作“如果状态未打开或设置了 send() 标志,则会引发“InvalidStateError”异常。” 这就是setRequestHeader所做的。此外,您的代码很奇怪,您会将它与同步请求一起使用。

所以这里的问题是浏览器没有像规范所说的那样返回零。更改 if 语句中的顺序会阻止浏览器到达该点,因为第一次检查失败。

还有WebKit 上的 bug

于 2013-03-25T19:25:55.977 回答