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, время: 21:51. |