2013-03-25 2 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

+0

после нажатия кнопки – bevacqua

+0

@EricLeschinski Не правда, 'readyState' сразу же доступен ... это свойство' XMLHttpRequest' – Ian

ответ

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“исключение, если государство не ОТКРЫТ или если флаг отправки() установлен.» что и есть setRequestHeader. Также ваш код странно, что вы будете использовать его с синхронным запросом.

Так что проблема здесь в том, что браузер не возвращает нуль, как говорит спецификатор. Изменение порядка в выражении if не позволяет браузеру достичь этой точки с момента первой проверки.

И bug on WebKit

+1

Хороший улов. Я не понимаю, почему возникает исключение, потому что «xhr.status» не будет «undefined» (или что-то еще) и просто не будет равен «200»? Я бы подумал, что это просто закончит условие, а не бомба кода – Ian

+0

+1 Я думаю, я должен проверить свой ответ, прежде чем публиковать. – Musa

+0

Действительно? Разве это не должно быть '0' (как в Opera) или' undefined', а вместо того, чтобы бросать исключение? – Bergi

Смежные вопросы