Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2011, 17:27
Новичок на форуме
Отправить личное сообщение для hfalcon Посмотреть профиль Найти все сообщения от hfalcon
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2011, 17:50
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Вы знаете, что означает буква A в аббревиатуре AJAX? И что означает третий аргумент у метода open, который Вы указали в false?
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2011, 18:02
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #4 (permalink)  
Старый 20.11.2011, 18:11
Интересующийся
Отправить личное сообщение для Black Moon Посмотреть профиль Найти все сообщения от Black Moon
 
Регистрация: 04.11.2011
Сообщений: 14

B@rmaley.e><e прав

попробуйте req.open("GET", baseAddr + param, true);
Ответить с цитированием
  #5 (permalink)  
Старый 20.11.2011, 19:11
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Black Moon, лучше рассчитывать на асинхронное поведение и использовать callback.
Ответить с цитированием
  #6 (permalink)  
Старый 20.11.2011, 19:16
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Black Moon
B@rmaley.e><e прав

попробуйте req.open("GET", baseAddr + param, true);
Ахах) Как же прекрасно вы поняли намёк B@rmaley.e><e)..
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #7 (permalink)  
Старый 20.11.2011, 19:18
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

hfalcon, вам нужно использовать onreadystatechange. Прочтите это и первую книжку моего списка.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #8 (permalink)  
Старый 21.11.2011, 10:26
Новичок на форуме
Отправить личное сообщение для hfalcon Посмотреть профиль Найти все сообщения от hfalcon
 
Регистрация: 18.11.2011
Сообщений: 5

Спасибо, что пытаетесь помочь.
Для B@rmaley.e><e:
третий параметр отвечает за синхронность/асинхронность запросов
его рекомендуют ставить в true
увы, это пройденный этап - с любым значением результат тот же

Для trikadin:
Вы абсолютно правы, в таком виде текст НЕ ЧИТАБЕЛЕН, но встроенный
редактор постоянно съедает всё моё форматирование, попробую
исправиться.
Ответить с цитированием
  #9 (permalink)  
Старый 21.11.2011, 10:32
Новичок на форуме
Отправить личное сообщение для hfalcon Посмотреть профиль Найти все сообщения от hfalcon
 
Регистрация: 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 только в тестовых целях!
}
Ответить с цитированием
  #10 (permalink)  
Старый 21.11.2011, 10:43
Новичок на форуме
Отправить личное сообщение для hfalcon Посмотреть профиль Найти все сообщения от hfalcon
 
Регистрация: 18.11.2011
Сообщений: 5

Спасибо! Теперь знаю как форматировать код на форуме.
Сразу маленькое, но важное дополнения (видно по вине не форматирования это не попало в вопрос): и открываемая страница
и адрес в запросе в JavaScript'е находятся на одном сервере.Так что кросс-доменностью тут не пахнет.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обёртка под XMLHttpRequest systemiv Общие вопросы Javascript 4 31.08.2011 08:59
Браузер не успевает определить высоту вновь созданного через XMLHttpRequest элемента Lockpickup AJAX и COMET 17 25.04.2011 17:58
XMLHttpRequest status=0, хотя запрос проходит. arigasa AJAX и COMET 4 15.02.2011 20:14
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Создание и уничтожение XMLHttpRequest Vlas AJAX и COMET 9 22.05.2009 12:38