2013-03-25 94 views
2

我想不通为什么这个fiddle抛出为什么这段js会抛出一个DOM异常?

Uncaught Error: InvalidStateError: DOM Exception 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

你的小提琴适合我。你会在哪一行收到错误信息? – Bergi 2013-03-25 19:26:06

+0

点击按钮后 – bevacqua 2013-03-25 19:26:30

+0

@EricLeschinski不正确,'readyState'立即可用...这是'XMLHttpRequest'属性 – Ian 2013-03-25 19:27:48

回答

8

的问题是不可用的状态,当readyState为0/1

你需要扭转的顺序,你如果。

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

细则中指出,它应该返回零"If the state is UNSENT or OPENED, return 0 and terminate these steps.",但由于某些原因,一些浏览器这样做“抛出的‘InvalidStateError’如果国家没有打开,或者如果在send()标志设置例外。”这是setRequestHeader所做的。此外,你的代码很奇怪,你会用它与一个同步请求。

所以这里的问题是浏览器不像规范说的那样返回零。自第一次检查失败以后,更改if语句中的顺序可防止浏览器到达该点。

bug on WebKit

+1

好的。我不明白的是为什么抛出一个异常,因为不会'xhr.status'只是'undefined'(或者其他)而只是不等于'200'?我认为它会失败的条件,而不是炸的代码 – Ian 2013-03-25 19:28:54

+0

+1我想我应该检查我的答案,然后再发布。 – Musa 2013-03-25 19:29:02

+0

真的吗?它不应该只是'0'(如在Opera中)或者'undefined'那么不是抛出异常? – Bergi 2013-03-25 19:31:46

相关问题