我无法弄清楚为什么这个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);
答案 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语句中的顺序会阻止浏览器到达该点,因为第一次检查失败。