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

HTML+CSS+JavaScript

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

 

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

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

тема: AJAX, слияние ответов сервера
 
 автор: blackcement   (23.11.2010 в 14:50)   письмо автору
 
 

Здравствуйте. Решил на своём сайте сделать проверку логина на корректность и уникальность с помощью AJAX. Функция (приведённая ниже) вызывается при отпускании кнопки клавиатуры на ИНПУТе. Если набирать по одному символу(ожидая ответа сервера), то всё работает нормально, а если быстро набирать, то результаты ответов каждого запроса сливаются вместе. Главное в IE всё нормально, а в ОПЕРЕ нет. Помогите пожалуйста.

function CheckLogin()
{
var link="./checklogin.php?login=";
var user_login=document.getElementById ('user').value;
link+=user_login;
AjaxObj.open ('GET',link );
AjaxObj.onreadystatechange = WriteSpan; 
AjaxObj.send (null);
}

function WriteSpan ()
{
   if (AjaxObj.readyState == 4)
   { 
     var alltext=AjaxObj.responseText;
     document.getElementById ('check').innerHTML=alltext;       
   }
}

  Ответить  
 
 автор: АЯ   (23.11.2010 в 15:50)   письмо автору
 
   для: blackcement   (23.11.2010 в 14:50)
 

Тезисно:
1. Всякое отпускание клавиши запускает таймер на 2 секунды.
2. Всякое последующее нажатие клавиши в пределах этих 2-х секунд отключает запущенный ранее таймер.
3. Если таймер не отключён пользователем в течении двух секунд, то идёт запрос к серверу (запускается Ваша функция CheckLogin ).

4. И, если ВДРУГ юзер нажал очередную кнопку даже по истечении 2-секунд, а ответ от сервера ещё не получен, то никто не мешает Вам отменить получение ответа от сервера (сиречь прописать в это же мгновение AjaxObj.onreadystatechange = WriteSpannull;)

  Ответить  
 
 автор: blackcement   (23.11.2010 в 19:59)   письмо автору
 
   для: АЯ   (23.11.2010 в 15:50)
 

Спасибо, технику понял. По Вашему же принципу переписал код, но без таймера обошёлся.
АЯ, мне очень важно Ваше мнение.

<script language=JavaScript>
var AjaxObj = (navigator.appName == 'Microsoft Internet Explorer') ?
new ActiveXObject ('Microsoft.XMLHTTP') : new XMLHttpRequest ();
var CheckLoginNow='';

function CheckLogin()
{
if (document.getElementById ('user').value=='')
{document.getElementById ('check').innerHTML='';} 

if ((CheckLoginNow=='') && (document.getElementById ('user').value!='')) 
   {
   CheckLoginNow=document.getElementById ('user').value;
   var user_login=CheckLoginNow;

   document.getElementById ('check').innerHTML='<font color="#557fff">Проверка...</font>';

   var link="./checklogin.php?login=";
   link+=user_login;

   AjaxObj.open ('GET',link );
   AjaxObj.onreadystatechange = WriteSpan; 
   AjaxObj.send (null);
   }
}

function WriteSpan ()
{
   if (AjaxObj.readyState == 4)
   { 
     if (CheckLoginNow==document.getElementById ('user').value) 
     {
     var alltext=AjaxObj.responseText;
     document.getElementById ('check').innerHTML=alltext;  
     CheckLoginNow='';
     } else 
         {
         CheckLoginNow='';
         CheckLogin();  
         }       
   }
}
</script> 

  Ответить  
 
 автор: АЯ   (23.11.2010 в 23:56)   письмо автору
 
   для: blackcement   (23.11.2010 в 19:59)
 

Что-то я не увидел НИЧЕГО из препятствующего быстрой многократной отсылке запросов серверу.

Сделайте так:
<input ... onkeyup="TIMER = setTimeout ('CheckLogin ()', 2000)" onkeydown="AjaxObj.onreadystatechange = null; clearTimeout (TIMER)">

+ обязательно в скриптовом блоке определите (вне функций) глобальную переменную var TIMER; (где-то рядом с определением AjaxObj)
А уж что там будут делать функции CheckLogin () и WriteSpan () - это зависит только от Вашего желания :-)

  Ответить  
 
 автор: blackcement   (24.11.2010 в 08:34)   письмо автору
 
   для: АЯ   (23.11.2010 в 23:56)
 

Дело в том, что я пока не пытался препятствовать быстрой многократной отсылке запросов серверу. У меня была проблема со слиянием ответов сервера.
Теперь буду ставить таймер.
Спасибо, АЯ.

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

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