Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ajax, выполнение НЕСКОЛЬКИХ запросов
 
 автор: psychomc   (04.03.2009 в 10:27)   письмо автору
 
 

....нескольких запросов или сохранение переданных данных что ли...может так правильнее

Недавно начала изучать 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 в 12:08)   письмо автору
 
   для: psychomc   (04.03.2009 в 10:27)
 

прошу просто хотя бы направить меня в нужное направление :-(

  Ответить  
 
 автор: Lelik   (04.03.2009 в 12:34)   письмо автору
 
   для: 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...";    

  Ответить  
 
 автор: psychomc   (04.03.2009 в 12:50)   письмо автору
1.3 Кб
 
   для: Lelik   (04.03.2009 в 12:34)
 

хотел бы я сказать что Вы гений....но 1 запрос все-равно не выполнится.... -------->

(Loading... так и будет висеть на этом элементе, все остальное отработает)

  Ответить  
 
 автор: PAT   (04.03.2009 в 13:22)   письмо автору
 
   для: psychomc   (04.03.2009 в 10:27)
 

>"Недавно начала изучать JS и Ajax"
и ниже
>"как уже говорил-только начал изучать"

Вы бы сначала с собственным полом разобрались, а уж потом с аяксом начали бы разбираться :-)


А если по сути заданного вами вопроса, то я не вижу здесь вовсе проблемы.
Оба процесса происходят - и по первому клику, и по второму...
Кликните третий раз - запустится параллельно и третий процесс.

Только вам этого НЕ ВИДНО.
Ибо передаёте вы функции process () один и тот же elem в качестве параметра.
Т.е. как бы говорите ученику у доски - "Напиши слово МАМА!" - и как только ученик берёт в руки мел, вы ему говорите - "Нет, напиши слово ПАПА".... А потом удивляетесь - а почему это слово МАМА вы на доске не видели?
Надо сделать иначе. Надо ученику сказать - "На доске напиши МАМА, а в тетрадке напиши ПАПА". Тогда вы увидите оба слова написанными.

Для тестирования попробуйте на трёх разных кнопках передать РАЗНЫЕ объекты страницы, где будут отображаться результаты. И увидите, что все три процесса идут совершенно самостоятельно. И идут они - от начала до логического своего завершения.

  Ответить  
 
 автор: psychomc   (04.03.2009 в 13:37)   письмо автору
 
   для: PAT   (04.03.2009 в 13:22)
 

не знаю зачем весь этот бред вверху, но если для Вас это имеет значение, то я мужского пола, просто очень спешил когда писал, ну да ладно...
а так про доску мне понравилось.... ;)))

да, Вы правы, действительно, идет один и тот же элемент для 2-х объектов... и результат из 1-го отработавшего подставляется во второй...

тогда такой вопрос, как функции handleServerResponse() передать нужный элемент?? или просто как сохранить ссылку на предыдущий что ли...
вроде бы же при вызове функция каждый раз получает новые параметры

  Ответить  
 
 автор: psychomc   (04.03.2009 в 16:46)   письмо автору
 
   для: psychomc   (04.03.2009 в 13:37)
 

разобрался вроде, надо было вызвать повторно при помощи setTimeout

вот только получается не параллельно тогда как Вы говорили

  Ответить  
 
 автор: psychomc   (04.03.2009 в 17:15)   письмо автору
 
   для: psychomc   (04.03.2009 в 16:46)
 

хотя с передачей параметров проблема так и не решилась :-((

  Ответить  
 
 автор: psychomc   (04.03.2009 в 17:46)   письмо автору
 
   для: psychomc   (04.03.2009 в 17:15)
 

извините, был не прав, теперь разобрался...столько нервных клеток убито...
почему-то переменная сначала не в какую не хотела передаваться из 1 функции во 2, потом заработало... ненавижу этот язык из-за его интерпретируемости.

  Ответить  
 
 автор: psychomc   (04.03.2009 в 18:49)   письмо автору
 
   для: psychomc   (04.03.2009 в 17:46)
 

хотя вопрос все еще открыт

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования