Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отложить вызов функции на 1 сек, после того как пользователь ввел текст 
V
    Опции темы
DEER
Дата 25.7.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



Народ, привет.
Не подскажете как можно начать выполнять функцию, после того как пользователь ввел какой то текст в input type=’text’ и если длина введенной строки > 3 символов?
Под «после того как пользователь ввел какой то текст» я подразумеваю, что он сделал паузу в набирании > 1 секунды, например

То есть как сдесь на форуме, вводишь название темы - страница джет какое то время, а потом ищет похожие темы

Пробовал так

Код

onkeyup=’setInterval(“myFunc”, 1000)’


но результат не такой как я ожидал, да и this.value, как я понял, ещё не содержит введенного символа


Это сообщение отредактировал(а) DEER - 25.7.2007, 11:31


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
smartov
Дата 25.7.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Все верно. Нужно использовать setТimeout
PM MAIL   Вверх
SelenIT
Дата 25.7.2007, 17:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(DEER @  25.7.2007,  11:31 Найти цитируемый пост)
this.value, как я понял, ещё не содержит введенного символа

Содержать-то оно его содержит, но вот достучаться до него не так-то просто: this доступен только в обработчике, но в вызываемую из него ф-цию его нужно явно передать (например, создав "замыкание"). И еще, имхо, таймер должен срабатывать лишь тогда, когда действительно целую секунду ничего не нажимали (иначе может выстроится очередь из кучи таймеров, мешающих друг другу). Пример:
Код

onkeyup="if(this.t)clearTimeout(this.t); this.t=setTimeout((function(argument) { return function() { alert(argument);} })(this.value), 1000)"




--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
smartov
Дата 25.7.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



SelenIT, вопрос задавал не я, но я ставлю плюс, потому что долго не мог найти как передавать инлайном параметры в лямда-функции smile
PM MAIL   Вверх
Zeroglif
Дата 25.7.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Код

setTimeout('func(\''+this.value+'\')',1000)


 smile 
PM MAIL WWW   Вверх
SelenIT
Дата 25.7.2007, 20:03 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Zeroglif, это даже неспортивно как-то... smile 


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 26.7.2007, 07:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(SelenIT @  25.7.2007,  20:03 Найти цитируемый пост)
даже неспортивно как-то...

Куда деваться - мы же с ним в "разных весовых категориях" smile
А по-теме, кстати, вот что:
Код

<input type='text' onkeyup='clearTimeout(this.t); this.t = setTimeout(myFunc, 1000, this)' />

SelenIT, дополнительные параметры ведь уже давно поддерживают и FF, и Opera (любимая нежно ;) ). Причем эта "фича" уже не новая - точно не знаю, с какого времени, но у меня FF 0.8 (2004 г) "узнает это дело" (короче говоря, "фича" с тех времен, когда я не знал, что такое "хтмл" ;) ).
Что я хочу сказать - удобно ведь очень! Передал this и делай в myFunc (где он будет первым аргументом) с этим this все, что хочешь!
Чтобы это работало в IE, можно написать доп. расширение. На форуме Xpoint я писал, но оставили без комментариев. Попробую здесь, в здешней компании обсудить вот такое расширение для IE:
Код

function windowXpander(aMethod) {
    var original = window[aMethod];
    window[aMethod] = function (aFunc, aDelay) {
        var args = [],
            len = arguments.length,
            func;
        if (len > 2) {
            while (len-- > 2) {
                args[len - 2] = arguments[len];
            }
            func = function () {
                return aFunc.apply(null, args); // вот здесь еще бы научиться без apply...
            }
        }
        return original(func || aFunc, aDelay);
    }
}

if (window.execScript) {
    windowXpander('setTimeout');
    windowXpander('setInterval');
}


В результате - функция myFunc из аттрибута onkeyup:
Код

function myFunc(aThis) {
    alert(aThis.value);
}

отработает и в IE...

Это сообщение отредактировал(а) AKS - 26.7.2007, 11:11
PM MAIL   Вверх
DEER
Дата 26.7.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



Народ всем спасибо.
Я сам сделал, залез выложить а тут такое )
мой вариант
Код

function time_kdoun() {
    flag = false;
}
function time_kup(DivId, tbId, hiddenId, minCount) {
    flag = true;
    clearInterval(interval);
    interval = setInterval('check_flag("'+DivId+'", "'+tbId+'", "'+hiddenId+'", '+minCount+')', 1500);
}

function check_flag(DivId, tbId, hiddenId, minCount) {
    clearInterval(interval);
    if(flag) {
        findCompanies(DivId, tbId, hiddenId, minCount);
    }
}

Код

<input type="text" name="companySearcher" id="companySearcher" size="20" maxlength="50" style="width:300" onkeyup="time_kup('ajaxDiv', 'companySearcher', 'model.companyId', 3)" onkeydown="time_kdoun()"/>



--------------------
 
PM MAIL WWW ICQ MSN   Вверх
AKS
Дата 26.7.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(DEER @  26.7.2007,  09:28 Найти цитируемый пост)
Я сам сделал...

А предложенный мной вариант испытать не желаете? Давайте "рискнем"! ;)
Получится как-нибудь так:
Код

<input type="text" onkeyup="clearTimeout(findCompanies.id);
 findCompanies.id = setTimeout(findCompanies, 1000, 'ajaxDiv', this, 'model.companyId', 3)"  />

Только вместо id этого поля в функцию findCompanies будет передана ссылка непосредственно на это поле (не надо будет писать document.getElementById или типа того). И вспомогательных функций time_kdoun/time_kup не понадобится...

PM MAIL   Вверх
Zeroglif
Дата 26.7.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  26.7.2007,  07:16 Найти цитируемый пост)
Что я хочу сказать - удобно ведь очень!


- а как быть со строкой первым аргументом?
- а как быть с синтаксисом setTimeout в IE, не страшно?

PM MAIL WWW   Вверх
AKS
Дата 26.7.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif
1. Как быть со строкой первым аргументом?
Думаю, что здесь может помочь знание синтаксиса - DOM:window.setTimeout/DOM:window.setInterval.
2. Как быть с синтаксисом setTimeout в IE, не страшно?
"Волков бояться - в лес не ходить". ;) Я как-раз для этого и предложил взглянуть на windowXpander, чтобы разобраться и потом уже ничего не бояться. Очень надеюсь на Вас, в частности в случае с apply ("старая гвардия" должна знать, как обойтись без него - ведь как-то обходились до третьего издания, или до второго... когда он там появился).

PM MAIL   Вверх
Zeroglif
Дата 26.7.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  26.7.2007,  10:53 Найти цитируемый пост)
Думаю, что здесь может помочь знание синтаксиса

То есть отказаться от использования строк вообще... или всё-таки проще доделать функцию? 

Цитата(AKS @  26.7.2007,  10:53 Найти цитируемый пост)
чтобы разобраться и потом уже ничего не бояться

IE описал свой синтаксис, мы выходим за его рамки, остаётся только верить в лучшее...  smile

Цитата(AKS @  26.7.2007,  10:53 Найти цитируемый пост)
старая гвардия

Не про меня.

Цитата(AKS @  26.7.2007,  10:53 Найти цитируемый пост)
как обойтись без него

Собрать из массива будущие аргументы в строку, потом вызов через eval... если же предполагать, что число аргументов всё-таки имеет разумный предел (3-5), то проще проверять по switch-case длину массива и вперёд...

PM MAIL WWW   Вверх
AKS
Дата 26.7.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Zeroglif)

Отказаться от использования строк вообще.

Нет, я себе это представил следующим образом. Раз известен синтаксис, который в случае со строкой в первом агрументе не предполагает использования экстра-параметров, то и нечего на них расчитывать. Т.е. все просто: хочешь строку - забудь про доп. параметры.
Цитата(Zeroglif)

IE описал свой синтаксис.

Ну мне показалось, что расширение довольно "безобидное", т.е. ничего вроде бы не "ломает".
Цитата(Zeroglif)

Не про меня.

Да неужели? smile
Цитата(Zeroglif)

Вызов через eval.

У меня сегодня чего-то "замкнуло" в этой, самой, как ее там называют - ее еще почесать можно... тьфу - в голове. smile Знаю прекрасно, как делается эмуляция apply/call, а вот как это дело портировать в саму функцию? Ну не могу чего-то сегодня и все. Чуть позже попробую со второй попытки...

Это сообщение отредактировал(а) AKS - 26.7.2007, 12:17
PM MAIL   Вверх
Zeroglif
Дата 26.7.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  26.7.2007,  12:14 Найти цитируемый пост)
Т.е. все просто: хочешь строку - забудь про доп. параметры.

Хех... а код-то вы похоже исправили, а я-то копипастнул первоначальный, тот, где if (len > 1)...  smile 
Цитата(AKS @  26.7.2007,  12:14 Найти цитируемый пост)
ничего вроде бы не "ломает".

определяюшая фраза - "вроде бы"... 
PM MAIL WWW   Вверх
AKS
Дата 26.7.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Zeroglif @  26.7.2007,  12:37 Найти цитируемый пост)
а код-то вы похоже исправили

Да, исправил - Вам СПАСИБО!!!
Цитата(Zeroglif @  26.7.2007,  12:37 Найти цитируемый пост)
определяюшая фраза - "вроде бы"

Ну а еще подсказочку можно? Звонок другу или чего там еще бывает? smile


PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1246 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.