Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.04.2009, 23:31
Новичок на форуме
Отправить личное сообщение для x][x Посмотреть профиль Найти все сообщения от x][x
 
Регистрация: 29.04.2009
Сообщений: 6

Заполнение таблицы с помощью AJAX
Добрый день, помогите разобраться, есть скрипт который должен заполнять форму таким образом: вводится имя, по нему ищется строка в базе и от туда берутся имена отца и матери, далее берется имя отца/матери и так же ищется строка.

таблица:

<table border=1>
<tr BGCOLOR=EEEEFF><td width=200 rowspan=8>
	<INPUT TYPE=text SIZE=20 id=idf1 VALUE="" onChange="process(this.id)">
</td><td width=200 rowspan=4>
	<INPUT TYPE=text SIZE=20 id=idf11 VALUE="" onChange="process(this.id)">
</td><td width=200 rowspan=2>
	<INPUT TYPE=text SIZE=20 id=idf111 VALUE="" onChange="process(this.id)">
</td><td width=200>
	<INPUT TYPE=text SIZE=20 id=idf1111 VALUE="" onChange="process(this.id)">
</td></tr>
<tr BGCOLOR=FFEEFF><td>
	<INPUT TYPE=text SIZE=20 ID=idf1112 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF rowspan=2>
	<INPUT TYPE=text SIZE=20 id=idf112 VALUE="" onChange="process(this.id)">
</td><td>
	<INPUT TYPE=text SIZE=20 id=idf1121 VALUE="" onChange="process(this.id)">
</td></tr>
<tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF>
	<INPUT TYPE=text SIZE=20 id=idf1122 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF rowspan=4>
	<INPUT TYPE=text SIZE=20 id=idf12 VALUE="" onChange="process(this.id)">
</td><td rowspan=2>
	<INPUT TYPE=text SIZE=20 id=idf121 VALUE="" onChange="process(this.id)">
</td><td>
	<INPUT TYPE=text SIZE=20 id=idf1211 VALUE="" onChange="process(this.id)">
</td></tr>
<tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF>
	<INPUT TYPE=text SIZE=20 id=idf1212 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF rowspan=2>
	<INPUT TYPE=text SIZE=20 id=idf122 VALUE="" onChange="process(this.id)">
</td><td>
	<INPUT TYPE=text SIZE=20 id=idf1221 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF>
	<INPUT TYPE=text SIZE=20 id=idf1222 VALUE="" onChange="process(this.id)">
</td></tr>
</table>

и две функции:
idForm = "";
// make asynchronous HTTP request using the XMLHttpRequest object 
function process(idForm0, idForm1)
{

   idFormArray=new Array()
   if (idForm1) idFormArray [0]=idForm0; 
   if (idForm2) idFormArray [1]=idForm1;
      for (var i=0; i<idFormArray.length; i++){
      document.getElementById("divProcess").innerHTML += 
                                            '<i>' + idFormArray[i] + '</i><br>';
	if (idFormArray[i].length>6){
           break;}
        else{
	// proceed only if the xmlHttp object isn't busy
	  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
	  {

 	   // retrieve the name typed by the user on the form
 	   name = encodeURIComponent(document.getElementById(idFormArray[i]).value);
 	   // execute the quickstart.php page from the server
  	  xmlHttp.open("GET", "rss.php?name=" + name, true);  
  	  // define the method to handle server responses
		idForm = idFormArray[i];
  	  xmlHttp.onreadystatechange = handleServerResponse;
 	   // make the server request
 	   xmlHttp.send(null);
	  }
 	 }
	}

}
// executed automatically when a message is received from the server
function handleServerResponse() 
{
  // move forward only if the transaction has completed
  if (xmlHttp.readyState == 4) 
  {
    // status of 200 indicates the transaction completed successfully
    if (xmlHttp.status == 200) 
    {
      // extract the XML retrieved from the server
      xmlResponse = xmlHttp.responseXML;
      // obtain the document element (the root element) of the XML structure
      xmlRoot = xmlResponse.documentElement;

	idArray = xmlRoot.getElementsByTagName('id');
	nameArray = xmlRoot.getElementsByTagName('name');
	otecArray = xmlRoot.getElementsByTagName('otec');
	matArray = xmlRoot.getElementsByTagName('mat');
      // get the text message, which is in the first child of
      // the the document element
	var d = document;
idFormOtec = idForm + "1";
idFormMat = idForm + "2";
  for (var i=0; i<idArray.length; i++){
      document.getElementById("div2").innerHTML += 
                                            '<i>' + idFormOtec + '</i><br>';
	if (idFormOtec.length>7){
           break;}
        else{
		d.getElementById(idForm).value = nameArray.item(i).firstChild.data;
		d.getElementById(idFormOtec).value = otecArray.item(i).firstChild.data;
		d.getElementById(idFormMat).value = matArray.item(i).firstChild.data;
//alert (idFormOtec);
		}}
      // restart sequence
      setTimeout('process(idFormOtec, idFormMat)', 10);
    } 
    // a HTTP status different than 200 signals an error
    else 
    {
      alert("There was a problem accessing the server: " + xmlHttp.statusText);
    }
  }
}

Таблица на половину заполняется, вся отцовская линия idf1-idf1111, а вот все что идет начиная от idf12 пустое. Если в первую функцию вставить alert(idFormArray[i]), то idf121 и idf122 заполняются, но дальше пусто. Xто-то с циклами не так, но где именно понять не могу.
PS xml формируется правильно.
Ответить с цитированием
  #2 (permalink)  
Старый 30.04.2009, 01:42
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

советую перейти на firebug
Ответить с цитированием
  #3 (permalink)  
Старый 30.04.2009, 23:14
Новичок на форуме
Отправить личное сообщение для x][x Посмотреть профиль Найти все сообщения от x][x
 
Регистрация: 29.04.2009
Сообщений: 6

Спасибо за совет, правда firebug'ом нашел только одну ошибку: onChange="process(this.id) передается только один параметр, а сама функция имеет два аргумента. Но у меня проблема в самом алгоритме, не могу понять, как запустить цикл и каким образом передавать параметры, что бы таблица заполнилась правильно.
Буду очень благодарен дельным предложениям.
Ответить с цитированием
  #4 (permalink)  
Старый 01.05.2009, 01:02
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

по-моему консоль ошибок и без firebug имеется
я имел в виду как раз про поиск логических ошибок: пишешь
idArray = xmlRoot.getElementsByTagName('id');
console.log(idArray);

при этом на вкладке Console firebug'а появляется содержимое переменной idArray; проверяешь, того ли ты ждал; и т.д.; конечно, проверять каждую строчку не обязательно - ты можешь проверять только подозрительные места
Ответить с цитированием
  #5 (permalink)  
Старый 05.05.2009, 01:38
Новичок на форуме
Отправить личное сообщение для x][x Посмотреть профиль Найти все сообщения от x][x
 
Регистрация: 29.04.2009
Сообщений: 6

переделал немного функцию
function process(idFI)
{
for (var i=0; i<idFI.length; i++){
      document.getElementById("divProcess").innerHTML += 
                                            '<i>' + idFI[i] + '</i><br>';
if (idFI[i].length>7){
           break;}
        else{
	  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
	  {
 	   name = encodeURIComponent(document.getElementById(idFI[i]).value);
  	  xmlHttp.open("GET", "rss.php?name=" + name, true);  
		idForm = idFI[i];
  	  xmlHttp.onreadystatechange = handleServerResponse;
 	   xmlHttp.send(null);
	}
  }
}
}

Теперь из функции handleServerResponse передаю массив, но из инпута передается просто переменная.
Вопрос: как можно отличить массив от простой переменной?

xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);

Я так понимаю, что данный код вызывает функцию handleServerResponse и передает в нее null, я прав?
Ответить с цитированием
  #6 (permalink)  
Старый 05.05.2009, 02:16
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

1) зачем?
"Теперь из функции handleServerResponse передаю массив" - куда?
"но из инпута передается просто переменная" - это как?

2) нет, ты назначаешь обработчик события "пришел ответ сервера" и посылаешь запрос серверу (при этом тело запроса отсутствует, нужно для запросов POST)
Ответить с цитированием
  #7 (permalink)  
Старый 05.05.2009, 11:48
Новичок на форуме
Отправить личное сообщение для x][x Посмотреть профиль Найти все сообщения от x][x
 
Регистрация: 29.04.2009
Сообщений: 6

Таблица:
<table border=1>
<tr BGCOLOR=EEEEFF><td width=200 rowspan=8>
    <INPUT TYPE=text SIZE=20 id=idf1 VALUE="" onChange="process(this.id)">
</td><td width=200 rowspan=4>
    <INPUT TYPE=text SIZE=20 id=idf11 VALUE="" onChange="process(this.id)">
</td><td width=200 rowspan=2>
    <INPUT TYPE=text SIZE=20 id=idf111 VALUE="" onChange="process(this.id)">
</td><td width=200>
    <INPUT TYPE=text SIZE=20 id=idf1111 VALUE="" onChange="process(this.id)">
</td></tr>
<tr BGCOLOR=FFEEFF><td>
    <INPUT TYPE=text SIZE=20 ID=idf1112 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF rowspan=2>
    <INPUT TYPE=text SIZE=20 id=idf112 VALUE="" onChange="process(this.id)">
</td><td>
    <INPUT TYPE=text SIZE=20 id=idf1121 VALUE="" onChange="process(this.id)">
</td></tr>
<tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF>
    <INPUT TYPE=text SIZE=20 id=idf1122 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF rowspan=4>
    <INPUT TYPE=text SIZE=20 id=idf12 VALUE="" onChange="process(this.id)">
</td><td rowspan=2>
    <INPUT TYPE=text SIZE=20 id=idf121 VALUE="" onChange="process(this.id)">
</td><td>
    <INPUT TYPE=text SIZE=20 id=idf1211 VALUE="" onChange="process(this.id)">
</td></tr>
<tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF>
    <INPUT TYPE=text SIZE=20 id=idf1212 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF rowspan=2>
    <INPUT TYPE=text SIZE=20 id=idf122 VALUE="" onChange="process(this.id)">
</td><td>
    <INPUT TYPE=text SIZE=20 id=idf1221 VALUE="" onChange="process(this.id)">
</td></tr><tr BGCOLOR=EEEEFF><td BGCOLOR=FFEEFF>
    <INPUT TYPE=text SIZE=20 id=idf1222 VALUE="" onChange="process(this.id)">
</td></tr>
</table>
<table border=2>
<tr>
<td>
  <div id="divProcess" />
</td>
<td>
  <div id="div2" />
</td>
<tr>
</table>


Функции:
var idForm = "";
function process(idFI)
{
for (var i=0; i<idFI.length; i++){
      document.getElementById("divProcess").innerHTML += 
                                            '<i>' + idFI[i] + '</i><br>';
if (idFI[i].length>7){
           break;}
        else{
	  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
	  {

 	   name = encodeURIComponent(document.getElementById(idFI[i]).value);
  	  xmlHttp.open("GET", "rss.php?name=" + name, true);  
		idForm = idFI[i];
  	  xmlHttp.onreadystatechange = handleServerResponse;
 	   xmlHttp.send(null);
	}
  }
}
}
function handleServerResponse() 
{
  if (xmlHttp.readyState == 4) 
  {
    if (xmlHttp.status == 200) 
    {
      xmlResponse = xmlHttp.responseXML;
      xmlRoot = xmlResponse.documentElement;

	idArray = xmlRoot.getElementsByTagName('id');
	nameArray = xmlRoot.getElementsByTagName('name');
	otecArray = xmlRoot.getElementsByTagName('otec');
	matArray = xmlRoot.getElementsByTagName('mat');
idFormOtec = idForm + "1";
idFormMat = idForm + "2";

  for (var i=0; i<idArray.length; i++){
      document.getElementById("div2").innerHTML += 
                                            '<i>' + idFormOtec + '</i><br>';
	if (idFormOtec.length>7){
           break;}
        else{
		document.getElementById(idForm).value = nameArray.item(i).firstChild.data;
		document.getElementById(idFormOtec).value = otecArray.item(i).firstChild.data;
		document.getElementById(idFormMat).value = matArray.item(i).firstChild.data;
		}}
idFAr=new Array()
idFAr[0] = idFormOtec;
idFAr[1] = idFormMat;
      setTimeout('process(idFAr)', 100);
    } 
    else 
    {
      alert("There was a problem accessing the server: " + xmlHttp.statusText);
    }
  }
}

Вобщем если вводить имя в инпут, то в функцию process передается только один id в который ввели текст, после отправки на сервер запроса и обработки ответа в функции handleServerResponse появляются еще два id инпутов? содержание которых надо отправить на сервер.
idFAr=new Array()
idFAr[0] = idFormOtec;
idFAr[1] = idFormMat;
      setTimeout('process(idFAr)', 100);
Ответить с цитированием
  #8 (permalink)  
Старый 05.05.2009, 11:57
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

1) например, так
idFI instanceof Array
Ответить с цитированием
  #9 (permalink)  
Старый 05.05.2009, 14:49
Новичок на форуме
Отправить личное сообщение для x][x Посмотреть профиль Найти все сообщения от x][x
 
Регистрация: 29.04.2009
Сообщений: 6

В чем может быть проблема, на сервер name отсылается только 3 раза и заполняются только idf1-idf1111, но если ставлю breakpoint на строку document.getElementById("divProcess").innerHTML += '<i>' + idFI[i] + '</i><br>'; заполняется вся таблица.
Ответить с цитированием
  #10 (permalink)  
Старый 05.05.2009, 20:42
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

сделай нормальные отступы для начала
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax таблица dimaxz AJAX и COMET 3 25.02.2009 12:51
Перемещение строк таблицы в Firefox barcelona jQuery 17 23.02.2009 15:41
Фиксированный заголовок таблицы ilshat Элементы интерфейса 6 20.12.2008 00:35
Неверный результат в AJAX с получением HTML Raynor AJAX и COMET 3 17.12.2008 18:38
как дождаться AJAX ответа scuter Общие вопросы Javascript 3 23.03.2008 05:54