|
|
|
| ....нескольких запросов или сохранение переданных данных что ли...может так правильнее
Недавно начала изучать JS и Ajax. Решил написать простое приложение, где будут выводится записи из БД и каждая запись будет удаляться асинхронным запросом. Работает....НО, если пользователь сделает запрос кликнув по элементу, а потом сразу второй запрос, то сервер не успевает обработать 1 и выполняется только 2. Знаю что можно сделать экран ожидания, это не проблема, или заблокировать скрыть элементы на время выполнения.... Но вконтакте все это работает практически одновременно как бы быстро я не кликал )). Вопрос в том, как это реализовать, т.е какие средства JavaScript нужно использовать? (вот допишу эту тему, пойду копаться в модулях контакта :), но как уже говорил-только начал изучать, поэтому наверное ничего толком не пойму ). И второй вопрос: правильно ли составлена сама логика, я имею ввиду вызов функции, основное отметил жирным шрифтом.
Код:
1) модуль вывода данных из бд и вызова ф-ции javascript для создания объекта
<?php
// выводим из базы записи и передаем функции обработчику номер дива, файл-обработчик на //сервере, id товара для обработки
// ........
while ($catalog = mysql_fetch_array($cat))
{
$i++;
echo '<tr><td>'.$catalog['name'].'</td>
<td id="addPic'.$i.'" align="center">
<a href="#"><img border="0" src=add.gif onClick=process("addPic'.$i.'","add.php","'.$catalog['id_catalog'].'");></td>
<td id="delPic'.$i.'" align="center"><a href="#"><img border="0" src=remove.gif onClick = process("delPic'.$i.'","de.phpl","'.$catalog['id_catalog'].'");></td>
</tr>';
}
// ......
?>
2) функции javascript
// содаем объект
var xmlHttp = createXmlHttpRequestObject();
function createXmlHttpRequestObject()
{
var xmlHttp;
// создаем объект (как в книге Ajax и PHP -ничего нового, поэтому не привожу код чтобы не // захламлять тему
// ........
// возвращаем объект
return xmlHttp;
}
// функция, выполняющая запрос
function process(elem,src,id)
{
var id;
var src;
var elem;
element = elem;
// выполяем запрос с переданными данными из php скрипта
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
xmlHttp.open("GET", src + "?id_catalog=" + id, true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
// вместо элемента выводим сообщение ожидания
document.getElementById(elem).innerHTML = "Loading...";
}
}
function handleServerResponse()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
xmlResponse = xmlHttp.responseXML;
xmlDocumentElement = xmlResponse.documentElement;
Result = xmlDocumentElement.firstChild.data;
// вместо сообщения ожидания результат из скрипта
document.getElementById(element).innerHTML = Result;
}
else
{
alert("There was a problem accessing the server: " + xmlHttp.statusText);
}
}
}
|
Скрипт обработчик php не привожу, т.к он просто возвращает сообщение....
Так вот, если пользователь выполнит сразу второй запрос после первого xmlHttp занят и результат не приходит и остается висеть "Loading...". Это понятно, потому что объект занят...Так все-таки как сделать? | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 10:27)
| | прошу просто хотя бы направить меня в нужное направление :-( | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 10:27)
| | а если так?
function process(elem,src,id)
{
var id;
var src;
var elem;
element = elem;
xmlHttp.open("GET", src + "?id_catalog=" + id, true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
// вместо элемента выводим сообщение ожидания
document.getElementById(elem).innerHTML = "Loading...";
}
|
| |
|
|
|
|
 1.3 Кб |
|
|
для: Lelik
(04.03.2009 в 12:34)
| | хотел бы я сказать что Вы гений....но 1 запрос все-равно не выполнится.... -------->
(Loading... так и будет висеть на этом элементе, все остальное отработает) | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 10:27)
| | >"Недавно начала изучать JS и Ajax"
и ниже
>"как уже говорил-только начал изучать"
Вы бы сначала с собственным полом разобрались, а уж потом с аяксом начали бы разбираться :-)
А если по сути заданного вами вопроса, то я не вижу здесь вовсе проблемы.
Оба процесса происходят - и по первому клику, и по второму...
Кликните третий раз - запустится параллельно и третий процесс.
Только вам этого НЕ ВИДНО.
Ибо передаёте вы функции process () один и тот же elem в качестве параметра.
Т.е. как бы говорите ученику у доски - "Напиши слово МАМА!" - и как только ученик берёт в руки мел, вы ему говорите - "Нет, напиши слово ПАПА".... А потом удивляетесь - а почему это слово МАМА вы на доске не видели?
Надо сделать иначе. Надо ученику сказать - "На доске напиши МАМА, а в тетрадке напиши ПАПА". Тогда вы увидите оба слова написанными.
Для тестирования попробуйте на трёх разных кнопках передать РАЗНЫЕ объекты страницы, где будут отображаться результаты. И увидите, что все три процесса идут совершенно самостоятельно. И идут они - от начала до логического своего завершения. | |
|
|
|
|
|
|
|
для: PAT
(04.03.2009 в 13:22)
| | не знаю зачем весь этот бред вверху, но если для Вас это имеет значение, то я мужского пола, просто очень спешил когда писал, ну да ладно...
а так про доску мне понравилось.... ;)))
да, Вы правы, действительно, идет один и тот же элемент для 2-х объектов... и результат из 1-го отработавшего подставляется во второй...
тогда такой вопрос, как функции handleServerResponse() передать нужный элемент?? или просто как сохранить ссылку на предыдущий что ли...
вроде бы же при вызове функция каждый раз получает новые параметры | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 13:37)
| | разобрался вроде, надо было вызвать повторно при помощи setTimeout
вот только получается не параллельно тогда как Вы говорили | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 16:46)
| | хотя с передачей параметров проблема так и не решилась :-(( | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 17:15)
| | извините, был не прав, теперь разобрался...столько нервных клеток убито...
почему-то переменная сначала не в какую не хотела передаваться из 1 функции во 2, потом заработало... ненавижу этот язык из-за его интерпретируемости. | |
|
|
|
|
|
|
|
для: psychomc
(04.03.2009 в 17:46)
| | хотя вопрос все еще открыт | |
|
|
|