AJAX: проблема с получением ответа

Aco

Новичок
AJAX: проблема с получением ответа

Всем привет.
Проблема в том, что после запроса на ajax в логах апача видно что php-скрипт отправил ответ(и действительно он отлично работает), а вот ajax первый запрос срабатывает, а на второй ни как не реагирует. Как проверка выявила что в аванте он не выдаёт ответ ибо readyState = 0 в опере readyState = 1, и больше readyState не меняетя.
Сами скрипты:
Делается локальный поисковик по шарам.
Имеется база данных с файлами и папками.
И так. Клиент запрашивает папки и файлы с определённым названием(жмёт на главной "поиск")
Грузится php-страничка с таблицами
...
<table width="100%" style="border:1px solid #CCCCCC">
<tr><td id="folders"></td></tr></table>

<font size='-3'><br></font>

<table width="100%" style="border:1px solid #CCCCCC">
<tr><td id="files"></td></tr></table>
...
где ajax заполняет ячейки с id="folders" все найденные папки,а id="files" - файлы.
При onLoad вызывается startUp(), где сами запросы ajax
PHP:
<script> // описан в <head>


<? echo "var req = '".urlencode($request)."';\n"; ?>  //наш запрос


function startUp()
{
    try {
          request = new XMLHttpRequest();
    } catch (trymicrosoft) {
          try {
                request = new ActiveXObject("Msxml2.XMLHTTP");
          } catch (othermicrosoft) {
                try {
                      request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (failed) {
                      request = false;
                }  
          }
    }
    
    if(!request)
    {
          alert("Error initial Ajax");
          return;
    }

    folder(); //функция, запрашивающая все запрашиваемые папки у сервера, записывающая их в таблицу с id="folders" и при получении ответа вызывает функцию file(), аналогичную folder() только для файлов.
}

function folder()
{
    if(!request)
        return;
	
    var url = "Find.php?request="+ req + "&where=folder";//req - название искомых папок и файлов данные пользователем.
    request.onreadystatechange = showFolders;
    request.open("GET", url, true);
    request.send(null);
    document.getElementById('folders').innerHTML = "<div align='center' class='std'><br>Поиск среди папок ...<br><br></div>";
}

function showFolders()
{
    if (request.readyState == 4)
    {
          if (request.status == 200)
	 document.getElementById('folders').innerHTML = request.responseText;
           else 
                 alert("Ошибочка вышла - " + request.status );	
     }
}

function file()
{
     if(!request)
          return;

     var url = "Find.php?request="+ req +"&where=file&inc="+inc;
     request.open("GET", url, true);
     request.onreadystatechange = showFiles;
     request.send(null);
     document.getElementById('files').innerHTML = "<div align='center' class='std'><br>Поиск среди файлов ...<br><br></div>";
}

function showFiles()
{
    if (request.readyState == 4)
    {
          if (request.status == 200)
	 document.getElementById('files').innerHTML = request.responseText;
           else 
                 alert("Ошибочка вышла - " + request.status );	
     }
}
</script>

Сам PHP-скрипт прост:

<?
//запрос у бд и заполние ответами переменную $answer - всё исправно работает
header("Content-type: text/html; charset=utf-8");
header("Cache-Control: no-cache, must-revalidate"); 
echo $answer;
?>
В вот в чем проблема:
При запросе, папки он выводит исправно а вот на файлах повисает, alert сообщает что в аванте readyState = 0 в опере readyState = 1, и больше readyState не меняетя, хотя апач отослал верный ответ.
Причем если не делать авто запуск file() с помощю folder(), а вручную то оба ответа отображаются.
Надеюсь проблема понятна...

-~{}~ 24.11.06 15:09:

Или ещё проще: с какого может быть, точнее не быть readyState равным 4 если ответ на запрос пришёл?
 

Апокалипсис

тех дир matras.ru
request.open("GET", url, true);
request.onreadystatechange = showFolders;
request.send(null);

onreadystatechange нужно делать после request.open
 

BRat

o_0
Aco
а где у тебя вызов функции file() вообще? или мы сами должны угадать?)
 

Aco

Новичок
ох, да...
перетрудился, очищая код от ненужной информации.
В функции showFolders() :
PHP:
function showFolders() 
{ 
    if (request.readyState == 4) 
    { 
          if (request.status == 200) 
                  document.getElementById('folders').innerHTML = request.responseText; 
           else  
                 alert("Ошибочка вышла - " + request.status );     
    } 
     file();
}
-~{}~ 25.11.06 09:18:

Сначало срабатывает функция folder(), она отсылает запрос, получает ответ, вызывается showFolders() она отображает все папки в таблице. showFolders() вызывает file(). Та отсылает запрос, Апач обрабатывает, отсылает ответ, вызывается showFiles() и тут readyState дальше 0 или 1 не уходит... пробывал request.onload'ом вызывать,такая же беда
 

Yarik Voronov

Новичок
У тебя объект request создан как глобальный. Твой скрипт отправляет два запроса (по идее должен отправить больше, т.е. до тех пор пока request.readyState != 4 и еще один в showFolders()), но сам объект request принимает только один ответ сервера в showFolders().

function showFolders()
{
if (request.readyState == 4)
{
if (request.status == 200)
document.getElementById('folders').innerHTML = request.responseText;
file();
else
alert("Ошибочка вышла - " + request.status );
}

}
если не поможет тебе следует сделать еще один объект XMLHttpRequest для функции file()
смотри:
http://developer.mozilla.org/en/docs/AJAX
http://developer.mozilla.org/en/docs/AJAX:Getting_Started
http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060927/
 
Сверху