
18.11.2011, 17:27
|
Новичок на форуме
|
|
Регистрация: 18.11.2011
Сообщений: 5
|
|
XMLHttpRequest всегда Status=0
Всем привет!
Проблема в следующем:
Я как пользователь захожу на URL/index.html
У меня в броузере отображается страничка, на которой
есть несколько кнопок. По onclick каждой из них вызывается
javascript функция, которая должна выполнить GET запрос
URL/file.php?list_of_parameters, получить ответ (file.php, распарсив
параметры, лезет в СУБД и получает в ответ XML ответ, который
возвращает тому, кто спрашивал) и отобразить этот ответ
на открытой страничке (без ей перезагрузки).
Для этой цели был выбран XMLHttpRequest.
Запрос уходит, доходит до сервера, СУБД регистрирует запрос
и выполняет свою работу исправно. Но... XMLHttpRequest.status
всегда равен 0...
Если же делать запрос через открытие нового окна, то проблем нет,
данные возвращаются и отображаются.
Код из программы:
// Создаём объект, если сможем...
>function createRequestObject() {
> if (typeof XMLHttpRequest === 'undefined') {
> XMLHttpRequest = function() {
> try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
> catch(e) {}
> try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
> catch(e) {}
> try { return new ActiveXObject("Msxml2.XMLHTTP"); }
> catch(e) {}
> try { return new ActiveXObject("Microsoft.XMLHTTP"); }
> catch(e) {}
> throw new Error("This browser does not support XMLHttpRequest.");
> };
> }
> return new XMLHttpRequest();
>}
// Пробуем выполнить запрос
>function doRequest(param){
> req = createRequestObject();
> if(req){
> req.open("GET", baseAddr + param, false);
> req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
> req.setRequestHeader("Cache-Control", "no-cache");
> req.overrideMimeType("text/plain; charset=x-user-defined");
> req.onreadystatechange = function() {
> if (req.readyState==4) {
> return(req.responseText);
> }
> }
> req.send(null);
> if(req.status == 200) {
> return("Status 200");
> }else{
> return("Status != 200");
> }
> }else{
> return("req = false");
> }
>}
// А это собстенно ф-ция, вызываемая по onclick
>function getBuild(){
> alert(doRequest("?get_build")); // alert только в тестовых целях!
>}
За неделю просмотрены сотни (а может и тысячи) сайтов и постов
на форумах. Везде одно и то же: должно работать...
Подскажите, пожалуйста, где "копать"? Может в приведённом коде
баг зарыт?
Последний раз редактировалось hfalcon, 18.11.2011 в 17:29.
|
|

18.11.2011, 17:50
|
 |
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Вы знаете, что означает буква A в аббревиатуре AJAX? И что означает третий аргумент у метода open, который Вы указали в false?
|
|

18.11.2011, 18:02
|
 |
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|

20.11.2011, 18:11
|
Интересующийся
|
|
Регистрация: 04.11.2011
Сообщений: 14
|
|
B@rmaley.e><e прав
попробуйте req.open("GET", baseAddr + param, true);
|
|

20.11.2011, 19:11
|
 |
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Black Moon, лучше рассчитывать на асинхронное поведение и использовать callback.
|
|

20.11.2011, 19:16
|
 |
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Сообщение от Black Moon
|
B@rmaley.e><e прав
попробуйте req.open("GET", baseAddr + param, true);
|
Ахах) Как же прекрасно вы поняли намёк B@rmaley.e><e)..
|
|

20.11.2011, 19:18
|
 |
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
hfalcon, вам нужно использовать onreadystatechange. Прочтите это и первую книжку моего списка.
|
|

21.11.2011, 10:26
|
Новичок на форуме
|
|
Регистрация: 18.11.2011
Сообщений: 5
|
|
Спасибо, что пытаетесь помочь.
Для B@rmaley.e><e:
третий параметр отвечает за синхронность/асинхронность запросов
его рекомендуют ставить в true
увы, это пройденный этап - с любым значением результат тот же
Для trikadin:
Вы абсолютно правы, в таком виде текст НЕ ЧИТАБЕЛЕН, но встроенный
редактор постоянно съедает всё моё форматирование, попробую
исправиться.
|
|

21.11.2011, 10:32
|
Новичок на форуме
|
|
Регистрация: 18.11.2011
Сообщений: 5
|
|
Вот отформатированный вариан кода
Код из программы:
// Создаём объект, если сможем...
function createRequestObject() {
if (typeof XMLHttpRequest === 'undefined') { XMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
// Пробуем выполнить запрос
function doRequest(param){
req = createRequestObject();
if(req){
req.open("GET", baseAddr + param, false);
req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 MT");
req.setRequestHeader("Cache-Control", "no-cache");
req.overrideMimeType("text/plain; charset=x-user-defined");
req.onreadystatechange = function() {
if (req.readyState==4) {
return(req.responseText);
}
}
req.send(null);
if(req.status == 200) {
return("Status 200");
}else{
return("Status != 200");
}
}else{
return("req = false");
}
}
// А это собстенно ф-ция, вызываемая по onclick
function getBuild(){
alert(doRequest("?get_build")); // alert только в тестовых целях!
}
|
|

21.11.2011, 10:43
|
Новичок на форуме
|
|
Регистрация: 18.11.2011
Сообщений: 5
|
|
Спасибо! Теперь знаю как форматировать код на форуме.
Сразу маленькое, но важное дополнения (видно по вине не форматирования это не попало в вопрос): и открываемая страница
и адрес в запросе в JavaScript'е находятся на одном сервере.Так что кросс-доменностью тут не пахнет.
|
|
|
|