为什么这段js会抛出DOM异常?

时间:2013-03-25 19:20:46

标签: javascript xmlhttprequest

我无法弄清楚为什么这个fiddle会抛出

  

未捕获错误: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);

1 个答案:

答案 0 :(得分:8)

问题是readyState为0/1时状态不可用

您需要撤消if中的顺序。

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

规范说它应该返回零"If the state is UNSENT or OPENED, return 0 and terminate these steps.",但由于某种原因某些浏览器会这样做“如果状态未打开或者设置了send()标志,则会引发”InvalidStateError“异常。”这是setRequestHeader的作用。您的代码也很奇怪,您可以将它与同步请求一起使用。

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

bug on WebKit