XMLHttpRequest
Доброго дня, надеюсь кому ни будь идея понятна
получить xmlhttp.status 200 в xmlhttp.readyState 1 но ответ статуса может быть только если xmlhttp.readyState 4 можно ли сделать подобную обработку запроса спасибо заранее
var xmlhttp
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); }
var i = 0, out = true
while(out)
{ if (i == 100) { out = false }
switch(xmlhttp.readyState)
{ case 0 : xmlhttp.open('POST', '/', true);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); break;
case 1 : if(xmlhttp.status == 200) { xmlhttp.send("mod=" + encodeURIComponent('sendo') ); } break;
case 2 : alert(2); break;
case 3 : alert(3); break;
case 4 : alert(4); break;
}
i++
}
|
XMLHttpRequest – это класс, его представитель создаётся при помощи ключевого слова new, и, присваивается, например, переменной xhr.
Цитата:
Вы можете получить статус тогда, когда получены заголовки. (это происходит тогда, когда xhr.readyState === 2, но чтобы это не выглядело очень магический, существуют обозначения для состоянии, т. е. другими словами, это происходит тогда, когда xhr.readyState === xhr.HEADERS_RECEIVED) без события readystatechange, но тогда придётся проверять, чтобы код работал только при изменении состояния (кроме xhr.LOADING, но вы поняли) плохой пример
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
const xhr = new XMLHttpRequest();
let i = 0, readyState, lastReadyState;
(function xhrLoop() {
let readyState = xhr.readyState;
if(readyState !== lastReadyState) {
switch(readyState) {
case xhr.UNSENT:
xhr.open("GET", "https://yesno.wtf/api", true);
break;
case xhr.OPENED:
xhr.send(null);
break;
case xhr.HEADERS_RECEIVED:
console.log(xhr.status);
break;
case xhr.LOADING:
break;
case xhr.DONE:
console.log(xhr);
return;
}
lastReadyState = readyState;
}
setTimeout(xhrLoop);
})();
</script>
</body>
</html>
но, конечно же более правильно использовать именно событие readystatechange, оно как раз происходит только при изменении состояния хороший пример
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://yesno.wtf/api", true);
xhr.send(null);
xhr.addEventListener("readystatechange", event => {
switch(xhr.readyState) {
case xhr.HEADERS_RECEIVED:
console.log(xhr.status);
break;
case xhr.LOADING:
break;
case xhr.DONE:
console.log(xhr);
break;
}
}, false);
</script>
</body>
</html>
Вообще событие readystatechange является частью интерфейса XMLHttpRequest, оно предназначено как раз для совместного использования! Цитата:
|
я почти разобрался
этот метод делает рекурсивный вызов и похоже подмену документа освобождая память от своей работы поэтому переменная в обработчике запроса остаётся не определённой почему рекурсивный первый вывод alert(response[0] + ' ' + response[1]) потом вывод в теле вызова xhr()
var xmlhttp
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); }
var response = [], lastReadyState;
response[1] = document
function xhr()
{
var readyState = xmlhttp.readyState;
if(readyState !== lastReadyState)
{
switch(readyState)
{ case xmlhttp.UNSENT: xmlhttp.open('POST', '/', true);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); break;
case xmlhttp.OPENED: xmlhttp.send("mod=" + encodeURIComponent('sendo') ); break;
//case xmlhttp.HEADERS_RECEIVED: break; //no coments
//case xmlhttp.LOADING: break; //...
case xmlhttp.DONE: response[0] = xmlhttp.response; alert(xmlhttp.response); return;
}
lastReadyState = readyState;
}
setTimeout(xhr);
}
xhr();
alert(response[0] + ' ' + response[1])
при чем если делать собственный вызов без тайм аута переполняется стек Maximum call stack size exceeded и такая же ошибка выскакивает если в функцию предавать параметры например xhr( response[0]) |
как сделать кнопку запустить?
|
| Часовой пояс GMT +3, время: 07:20. |