Имеется, к примеру, форма для регистрации пользователя.
При вводе в поле, н-р, "Пароль" при событии change на сервер отправляется запрос для проверки введённых данных регулярным выражением.
Нужен скрипт, который осуществлял бы проверку непосредственно при вводе данных.
Просто событие onkyup не подходит, так как на сервер полетит столько запросов, сколько символов введёт пользователь.
Вопрос: как осуществить отправку запроса после определённого промежутка времени (3 секунды, н-р)?
Примечание:
>Denis_ (Denis Biryukov)
>А зачем через секунды? Почему не сделать проверку по нажатию на кнопку отправки?
Дело в том, что проверка происходит динамически, на стороне сервера.
1. пользователь вводит что-то в поле
2. введённое отправляется на сервер для проверки
2.1 если, проходит регэкспу, всё нормально
2.2 если регэкспу не проходит, возвращаем ошибку
для чего мне нужна задержка? дело в том, что в данном случае "по нажатии кнопки" будет отправляться запрос на сервер, т.е. если юзер ввёл "abcdefgh", то на сервер уйдёт 8! запросов
хотелось бы этого избежать, т.е. отправлять запрос ч/з определённое время (пользователь перестал барабанить по клаве, 3 секунды, отправляем запрос)
пробовал settimeout или setinterval (как там правильно), в этом случае происходит задержка в 3 секунды и сразу отправка всех 8ми запросов (при вводе "abcdefgh")
Примечание:
>valera5505 (Валерий Кириченко)
>$("#password").keyup(function(){setTimeout(checkPassword(),3000);});
>Где checkPassword() ваша функция, либо просто пишете функцию там.
>Проверка происходит по истечении 3 секунд
Да, этим способом пробовал, но результат нужен несколько другой.
Как Я уже упоминал в Дополнении #1, после задержки происходит отправка запросов в количестве равным вводу в проверяемое поле.
А необходим всего один запрос на всю введённую цепочку символов.
Примечание:
Набросал пример, дабы стало яснее.
----
Имеется поле для ввода пароля (тип "text" пусть вас не смущает, это для тестирования).
<input type="text" id="P&APP_PAGE_ID._PASSWORD" onkeyup="f_timeout();" />
При вводе текста в данное поле запускается функция f_timeout().
----
Функция f_timeout() (временная задержка) по прошествии трёх секунд выполняет функцию f_checkPassword()
function f_timeout(){
setTimeout(f_checkPassword,3000);
}
Функция f_checkPassword() получает значение из поля для ввода пароля и помещает его (значение) в переменную на сервере.*
Запускаем процесс проверки пароля CHECKPASSWORD.**
function f_checkPassword(){
var ajaxRequest = new htmldb_Get(null,$v('pFlowId').value,'APPLICATION_PROCESS=CHECKPASSWORD',$v('pFlowStepId').value);**
ajaxRequest.add('P&APP_PAGE_ID._PASSWORDX',$v('P&APP_PAGE_ID._PASSWORD'));*
var ajaxResponse = ajaxRequest.get();
ajaxRequest = null;
}
----
Процесс проверки введённого значения.
BEGIN
IF REGEXP_LIKE(:P1_PASSWORDX, '^[0-9]{8,}$') THEN -- если удовлетворяет регулярному выражению
HTP.P('1'); -- то возвращаем единицу
ELSE
HTP.P('0'); -- если нет, то 0
END IF;
END;
----
Здесь (http://apex.oracle.com/pls/apex/f?p=10110:1) можно посмотреть как это работает (актуально на 09.01.2012).
Теперь о загвоздке: открываем файрфокс - дебаггер - консоль; вводим в поле "Пароль" любой текст; по прошествии 3х секунд отправится столько запросов, сколько было введено символов.
Вопрос: как отправить всего один запрос для проверки, вместо целой кипы?
З.Ы. решение нужно именно при вводе, события losefocus, change etc не интересуют.
Примечание:
>Denis_ (Denis Biryukov)
>Во-первых, по коду... Естественно, что запросов будет ровно столько, сколько было введено символов. И было бы странно, если б это было наоборот,
>т.к. функция f_timeout(); отрабатывается по каждому событию onkeyup.
>Во-вторых, совмещать HTML+JS - это моветон. "Котлеты - отдельно, мухи - отдельно".
>В-третих, без обид, но у меня складывается впечатление, что вы или новичок, или консерватор. Потому как только эти два типажа склонны
>к тому, чтоб сделать так, как вбили себе с голову изначально и не желают видеть хоть какую-то альтернативу. В этом случае, я вряд ли чем-то
>смогу помочь. Вариантов решения, порой может быть несколько и не обязательно зацикливаться на одном, т.к. какой-то может оказаться
>гораздо лучше.
Вы абсолютно правы, я новичок.
У меня реализован подобный механизм проверки по событию change, с этим всё хорошо. Недавно наткнулся на плагин jquery, который осуществляет проверку по keyup, но на стороне клиента (что не очень хорошо). Вот и появилась мысль организовать подобное с наименьшими нагрузками.
По поводу совмещения HTML и JS полностью согласен, сделано для удобства тестирования и доработок. В будущем всё будет разделено.
Благодарю за расширенные ответы.
Примечание:
>valera5505 (Валерий Кириченко)
>Наименьшими нагрузками на что?
>На сервер - только больше нагрузки (причем по сопливым поводам), а клиенту вообще от проверки ничего не будет (конечно, если для проверок вы не используете Celeron 100мгц)
да, это Я погорячился =)