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

HTML+CSS+JavaScript

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

 

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

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

тема: Не запускать функцию в интервале времени
 
 автор: vadimka   (11.03.2013 в 14:30)   письмо автору
 
 

Здравствуйте!

onkeyup="checkLogin(this.value);"

дергает функцию, как мне установить интервал, в период которого функцию не вызывается?
Заранее благодарю!

  Ответить  
 
 автор: vadimka   (11.03.2013 в 15:17)   письмо автору
 
   для: vadimka   (11.03.2013 в 14:30)
 

К примеру делаю такое:
function checkLogin1(LoginValue) {
setTimeout(function(){checkLogin(LoginValue)},350);
}

но как запретить дергать функцию, пока не прошли эти 350 мс?

соответственно:
onkeyup="checkLogin1(this.value);"

  Ответить  
 
 автор: ЯСА   (11.03.2013 в 17:43)   письмо автору
 
   для: vadimka   (11.03.2013 в 15:17)
 

<script>
var TMR = null;
function checkLogin (x) { здесь нужный вам код }
</script>

<input onkeyup="if (!TMR) checkLogin (this.value), TMR = setTimeout ('clearTimeout (TMR), TMR = null', 350)">

  Ответить  
 
 автор: vadimka   (11.03.2013 в 18:08)   письмо автору
 
   для: ЯСА   (11.03.2013 в 17:43)
 

Спасибо большое за помощь, все работает, не могли бы Вы объяснить как?

  Ответить  
 
 автор: ЯСА   (11.03.2013 в 18:42)   письмо автору
 
   для: vadimka   (11.03.2013 в 18:08)
 

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

этот идентификатор в коде используется в качестве флага (глобальная переменная TMR):
-- если флаг равен null, то по нажатию клавиши запускается функция проверки checkLogin (), после которой - пауза на период 350мс, в течение которого флаг (переменная TMR) не равен null, а равен какому-то положительному значению; по окончании паузы идентификатор очищается методом clearTimeout () и флаг обнуляется
-- соответственно, если флаг неравен null (в период паузы), то функция проверки checkLogin () по нажатию клавиши не запускается

в коде использованы запятые, а не точки с запятой, чтобы не плодить дополнительных фигурных скобок
при использовании точек с запятой код был бы таким:
<input onkeyup="if (!TMR) {checkLogin (this.value); TMR = setTimeout ('clearTimeout (TMR); TMR = null', 350)}">

//сравните с предложенным

<input onkeyup="if (!TMR) checkLogin (this.value), TMR = setTimeout ('clearTimeout (TMR), TMR = null', 350)">

  Ответить  
 
 автор: vadimka   (11.03.2013 в 18:51)   письмо автору
 
   для: ЯСА   (11.03.2013 в 18:42)
 

Спасибо!

  Ответить  
 
 автор: vadimka   (11.03.2013 в 19:18)   письмо автору
 
   для: vadimka   (11.03.2013 в 18:51)
 

Если можно еще вопрос - при быстором вводе букв, они не все вводяться
если ввести
qwerty

может быть
qwerty

или
qwer

или
qw

  Ответить  
 
 автор: vadimka   (11.03.2013 в 19:58)   письмо автору
 
   для: vadimka   (11.03.2013 в 19:18)
 

Смотрите:
var TMR = null;
    function checkLogin1(LoginValue) {
    $('#text-type-1').html( LoginValue );
        if (!TMR) {
            $('#text-type-3').html( LoginValue );
            checkLogin (LoginValue );
             TMR = setTimeout ('clearTimeout (TMR), TMR = null', 350);
         }else{
             $('#text-type-4').html( LoginValue );
         }
    }

в эти id попадает весь текст text-type-1 и text-type-4 и непольный в вот этот: text-type-3

  Ответить  
 
 автор: ЯСА   (11.03.2013 в 21:17)   письмо автору
 
   для: vadimka   (11.03.2013 в 19:58)
 

мой код соответствовал вашему решению "приостановить вызов функции на определённый период"

очевидно, что вы неверно решаете вашу задачу
логичнее было бы, например, осуществить периодический (через таймер) опрос значения инпута при фокусе на нём и завершающую проверку при потере фокуса
приблизительно так:
<script>
var TxtFld, TMR, PreVal = '';
function checkLogin ()
{
if (TxtFld.value != PreVal)
   {
   PreVal = TxtFld.value;

   // здесь помещаете нужный вам код, а пока вместо него - тестовый код для проверки исполнения
   var d = new Date ();
   document.getElementById ('inf').value += d.getMinutes ()      + ':'
                                          + d.getSeconds ()      + ':'
                                          + d.getMilliseconds () + ' -- |'
                                          + TxtFld.value         + '|\n';
   // конец тестового кода
   }
if (self.TMR) clearTimeout (TMR);
if (!arguments.length) TMR = setTimeout (checkLogin, 350);
}
</script>
<input onfocus="TxtFld = this; checkLogin ()" onblur="checkLogin (1)">

<p><textarea id="inf" style="width: 100%; height: 400px"></textarea>

-------

правило использования мягкого знака очень простое
задаёте вопрос "что делать?" в соответствующем падеже, и, если в вопросе НЕТ мягкого знака, то и в глаголе его не будет

примеры:
1. вы написали: "они не все вводятЬся"
если бы задали вопрос "они не все что делаЮТ?", то увидели, что мягкого знака писать НЕ НАДО
вы ошиблись

2. я написал "идентификаторы их будут друг от друга отличатЬся"
потому что я спросил "идентификаторы их будут друг от друга что делаТЬ?", и увидел, что мягкий знак использовать НАДО
и не ошибся
:)

подробнее см. здесь

  Ответить  
 
 автор: vadimka   (11.03.2013 в 22:00)   письмо автору
 
   для: ЯСА   (11.03.2013 в 21:17)
 

Спасибо за ответ! Вы меня немного не поняли.
Точнее я неправильно сформулировал задачу:) соответственно переименную функции для большего понимания:)
при вводе букв дергается обработчик checkLogin() каждый раз:) я поэтому создал промежуточную функцию checkLoginWhithDelay(), в которой происходит задержка и суммирование запросов к функции checkLogin()

onkeyup="checkLoginWhithDelay(this.value)"

можно ли здесь
 var TMR = null;
    function checkLoginWhithDelay(LoginValue) {
        if (!TMR) {
            checkLogin (LoginValue );
             TMR = setTimeout ('clearTimeout (TMR), TMR = null', 350);
         }
    }

т.е. задержку вызова checkLogin() сделать в другой функции?
Извините еще раз за неправильно сформулированный вопрос!
Грамматические ошибки - впредь постараюсь не делать:)

  Ответить  
 
 автор: vadimka   (12.03.2013 в 15:44)   письмо автору
 
   для: vadimka   (11.03.2013 в 22:00)
 

нашел решение в Интернете:
var tmr = null;
function checkLoginWhithDelay(LoginValue) {
    if(tmr != null) {
        clearTimeout(tmr);
    }
    tmr = setTimeout(function() {checkLogin(LoginValue)}, 500);
}

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

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