|
|
|
| Здравствуйте. Решил на своём сайте сделать проверку логина на корректность и уникальность с помощью 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;
}
}
|
| |
|
|
|
|
|
|
|
для: blackcement
(23.11.2010 в 14:50)
| | Тезисно:
1. Всякое отпускание клавиши запускает таймер на 2 секунды.
2. Всякое последующее нажатие клавиши в пределах этих 2-х секунд отключает запущенный ранее таймер.
3. Если таймер не отключён пользователем в течении двух секунд, то идёт запрос к серверу (запускается Ваша функция CheckLogin ).
4. И, если ВДРУГ юзер нажал очередную кнопку даже по истечении 2-секунд, а ответ от сервера ещё не получен, то никто не мешает Вам отменить получение ответа от сервера (сиречь прописать в это же мгновение AjaxObj.onreadystatechange = WriteSpannull;) | |
|
|
|
|
|
|
|
для: АЯ
(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>
|
| |
|
|
|
|
|
|
|
для: blackcement
(23.11.2010 в 19:59)
| | Что-то я не увидел НИЧЕГО из препятствующего быстрой многократной отсылке запросов серверу.
Сделайте так:
<input ... onkeyup="TIMER = setTimeout ('CheckLogin ()', 2000)" onkeydown="AjaxObj.onreadystatechange = null; clearTimeout (TIMER)">
+ обязательно в скриптовом блоке определите (вне функций) глобальную переменную var TIMER; (где-то рядом с определением AjaxObj)
| А уж что там будут делать функции CheckLogin () и WriteSpan () - это зависит только от Вашего желания :-) | |
|
|
|
|
|
|
|
для: АЯ
(23.11.2010 в 23:56)
| | Дело в том, что я пока не пытался препятствовать быстрой многократной отсылке запросов серверу. У меня была проблема со слиянием ответов сервера.
Теперь буду ставить таймер.
Спасибо, АЯ. | |
|
|
|