Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > JavaScript: Общие вопросы > Как отложить вызов функции на 1 сек |
Автор: DEER 25.7.2007, 11:31 | ||
Народ, привет. Не подскажете как можно начать выполнять функцию, после того как пользователь ввел какой то текст в input type=’text’ и если длина введенной строки > 3 символов? Под «после того как пользователь ввел какой то текст» я подразумеваю, что он сделал паузу в набирании > 1 секунды, например То есть как сдесь на форуме, вводишь название темы - страница джет какое то время, а потом ищет похожие темы Пробовал так
но результат не такой как я ожидал, да и this.value, как я понял, ещё не содержит введенного символа |
Автор: smartov 25.7.2007, 11:45 |
Все верно. Нужно использовать setТimeout |
Автор: SelenIT 25.7.2007, 17:48 | ||
Содержать-то оно его содержит, но вот достучаться до него не так-то просто: this доступен только в обработчике, но в вызываемую из него ф-цию его нужно явно передать (например, создав "замыкание"). И еще, имхо, таймер должен срабатывать лишь тогда, когда действительно целую секунду ничего не нажимали (иначе может выстроится очередь из кучи таймеров, мешающих друг другу). Пример:
|
Автор: smartov 25.7.2007, 18:03 |
SelenIT, вопрос задавал не я, но я ставлю плюс, потому что долго не мог найти как передавать инлайном параметры в лямда-функции ![]() |
Автор: Zeroglif 25.7.2007, 19:36 | ||
![]() |
Автор: SelenIT 25.7.2007, 20:03 |
Zeroglif, это даже неспортивно как-то... ![]() |
Автор: AKS 26.7.2007, 07:16 | ||||||
Куда деваться - мы же с ним в "разных весовых категориях" ![]() А по-теме, кстати, вот что:
SelenIT, дополнительные параметры ведь уже давно поддерживают и FF, и Opera (любимая нежно ;) ). Причем эта "фича" уже не новая - точно не знаю, с какого времени, но у меня FF 0.8 (2004 г) "узнает это дело" (короче говоря, "фича" с тех времен, когда я не знал, что такое "хтмл" ;) ). Что я хочу сказать - удобно ведь очень! Передал this и делай в myFunc (где он будет первым аргументом) с этим this все, что хочешь! Чтобы это работало в IE, можно написать доп. расширение. На форуме Xpoint я писал, но оставили без комментариев. Попробую здесь, в здешней компании обсудить вот такое расширение для IE:
В результате - функция myFunc из аттрибута onkeyup:
отработает и в IE... |
Автор: DEER 26.7.2007, 09:28 | ||||
Народ всем спасибо. Я сам сделал, залез выложить а тут такое ) мой вариант
|
Автор: AKS 26.7.2007, 10:13 | ||
А предложенный мной вариант испытать не желаете? Давайте "рискнем"! ;) Получится как-нибудь так:
Только вместо id этого поля в функцию findCompanies будет передана ссылка непосредственно на это поле (не надо будет писать document.getElementById или типа того). И вспомогательных функций time_kdoun/time_kup не понадобится... |
Автор: Zeroglif 26.7.2007, 10:24 |
- а как быть со строкой первым аргументом? - а как быть с синтаксисом setTimeout в IE, не страшно? |
Автор: AKS 26.7.2007, 10:53 |
Zeroglif 1. Как быть со строкой первым аргументом? Думаю, что здесь может помочь знание синтаксиса - http://developer.mozilla.org/en/docs/DOM:window.setTimeout/http://developer.mozilla.org/en/docs/DOM:window.setInterval. 2. Как быть с синтаксисом setTimeout в IE, не страшно? "Волков бояться - в лес не ходить". ;) Я как-раз для этого и предложил взглянуть на windowXpander, чтобы разобраться и потом уже ничего не бояться. Очень надеюсь на Вас, в частности в случае с apply ("старая гвардия" должна знать, как обойтись без него - ведь как-то обходились до третьего издания, или до второго... когда он там появился). |
Автор: Zeroglif 26.7.2007, 11:40 |
То есть отказаться от использования строк вообще... или всё-таки проще доделать функцию? IE описал свой синтаксис, мы выходим за его рамки, остаётся только верить в лучшее... ![]() Не про меня. Собрать из массива будущие аргументы в строку, потом вызов через eval... если же предполагать, что число аргументов всё-таки имеет разумный предел (3-5), то проще проверять по switch-case длину массива и вперёд... |
Автор: AKS 26.7.2007, 12:14 | ||||||||
Нет, я себе это представил следующим образом. Раз известен синтаксис, который в случае со строкой в первом агрументе не предполагает использования экстра-параметров, то и нечего на них расчитывать. Т.е. все просто: хочешь строку - забудь про доп. параметры.
Ну мне показалось, что расширение довольно "безобидное", т.е. ничего вроде бы не "ломает".
Да неужели? ![]()
У меня сегодня чего-то "замкнуло" в этой, самой, как ее там называют - ее еще почесать можно... тьфу - в голове. ![]() |
Автор: Zeroglif 26.7.2007, 12:37 |
Хех... а код-то вы похоже исправили, а я-то копипастнул первоначальный, тот, где if (len > 1)... ![]() определяюшая фраза - "вроде бы"... |
Автор: AKS 26.7.2007, 13:00 |
Да, исправил - Вам СПАСИБО!!! Ну а еще подсказочку можно? Звонок другу или чего там еще бывает? ![]() |
Автор: Zeroglif 26.7.2007, 13:46 |
AKS, ОК... я могу легко снять брюзжание по поводу непредсказуемости IE, не могу сформулировать точно, поэтому снимаю. Если формулировать в стиле бла-бла-бла, то хостовые методы живут своей жизнью плюс у IE судя по всему оригинальная реализация глобального объекта (он как бы двоится), отсюда возможные сюрпризы при присваивании ссылки на эти методы переменным или их замене на что-то своё. Несмотря на это стоит заметить, что не вы один пытаетесь сэмулировать setTimeout, есть http://webreflection.blogspot.com/2007/06/simple-settimeout-setinterval-extra.html и http://ecmascript.stchur.com/2006/06/07/settimeout-revisited/... это хорошо, значит, они тоже тестировали и тоже пришли к позитивному выводу, это радует... ![]() |
Автор: smartov 26.7.2007, 14:07 |
Я не совсем понимаю зачем вы устроили споры по поводу дороговизны реализации setTimeout для веб-девелоперов всех стран, если есть кросбраузерный вариант, который уже давно http://forum.vingrad.ru/index.php?showtopic=165006&view=findpost&p=1206881. |
Автор: Zeroglif 26.7.2007, 14:25 |
smartov, создавать 2 дополнительных функции и делать 1 дополнительный вызов только ради того, чтобы удержать в руках ссылку на текущий объект - это ненормально. Можно, конечно, обойтись и 1-ой функцией, но это тоже будет слишком жирно для такой простой задачи. Отсюда движки, осознающие эту ненормальность, предлагают свои правильные нормальные решения и вводят дополнительные аргументы. Чтоб нам было удобно. AKS предлагает эмуляцию такого "правильного решения" для IE. Чтоб нам было удобно. Это никак не отменяет пользы замыканий (вариант SelenIT), это дорога в ту же сторону, никто не спорит, просто трём'c... |
Автор: smartov 26.7.2007, 14:27 |
Zeroglif, ааа... ясно Просто как по мне ничего такого особенно в провозглашении анонимной функции и ее вызове нету. Любо явист вообще скажет что это в порядке вещей. |
Автор: Zeroglif 26.7.2007, 15:13 | ||||
Согласен. Анонимная функция сама по себе может и в порядке вещей, но использовать её не из любви к искусству, а почём зря или вынужденно - это имхо беспорядок.
|
Автор: AKS 26.7.2007, 16:57 | ||||
Zeroglif, я написал вариант без apply. Сделал, кстати, еще и условие "пожестче":
Но ведь конструкция с eval помедленней получается! Вот тест:
Спрашиваю вашего мнения, т.к. именно Вы всегда отмечаете, что apply/call - это вещи, которые далеко не везде "известны". |
Автор: Zeroglif 26.7.2007, 19:22 |
Это правильно. Игра-то ваша, вы же хотите уйти от apply и в то же время поддержать неопределённое число аргументов, куда деваться-то... имхо трёх допаргументов хватит за глаза. |
Автор: AKS 26.7.2007, 20:33 | ||
Не по своей воле. ![]() Тут по-поводу "жесткости" еще вопросы появляются. Вот так:
у меня ну ни-и-икак не хочет работать нативный setInterval/setTimeout (т.е. с допом). Вот если функция вместо строки, то работает. А если заменить на эмулированный, то хоть как работает. Так что же делать? Идти, как говорится, до конца и эмулировать поведение полностью. Хотя чего я тороплюсь - может это только у меня не работает... |
Автор: Zeroglif 27.7.2007, 00:36 |
У меня тоже не работает. Равно как и игра с другими свойствами хоста, например, document.title+=2, что-то IE не нравится, или давай ему третьим аргументом язык, или упс... |
Автор: AKS 27.7.2007, 09:03 |
Еще раз спасибо! Ситуация проясняется. Все верно - по умолчанию 'jscript', а тут вдруг указал я ему черт знает что - конечно не будет работать, ведь строку на таком языке ( 1 ) он разобрать не может... P.S. Вы, наверно, миллионер (если исчислять в "спасибо")? ![]() |
Автор: AKS 27.7.2007, 10:21 | ||
Ну чтож, пока вот такая штуковина получилась - надеюсь, что больше никаких "аномалий" не выявится (главное - придумал имя крутое ![]()
|
Автор: smartov 27.7.2007, 10:32 |
Оригинально, но велосипед еще тот ![]() |
Автор: AKS 27.7.2007, 10:46 |
Т.е. это уже где-то кто-написал? Чтож Вы сразу не сказали - я бы время зря не тратил. :( |
Автор: Diesel Draft 27.7.2007, 10:50 |
settimeout(); |
Автор: Zeroglif 27.7.2007, 11:36 |
AKS, Если language пришёл третьим аргументом его бы надо пропустить в родной таймаут. Вместо !aFunc.apply лучше !Function.prototype.apply. Проверка на [native code] мне кажется лишней/непредсказуемой, может всё-таки обезопасить себя не переопределением родного/чужого setTimeout-а, а созданием своего (отдельно лежащего) метода (как у stchur-а) на свой объект. Строгое равенство при сравнении с typeof aFunc - масло масляное. Не хотите проверить на неравенство сo 'string', чем равенство с 'function' , у IE некоторые методы типа 'object', да и в разных браузерах может быть по разному. Где итерация и где return из func я бы записал всё в одну строку тернарным..., легче будет читать... Ещё, чуть не забыл, аргументы для eval лучше бы собрать в строку, !!!не стоит полагаться на массив. AKS, +1 Добавлено @ 11:42 Лучше SETtimeOUT(); ![]() |
Автор: AKS 27.7.2007, 12:10 | ||||
О-о-о, спасибО!
Точно, так и надо! Сделаю! А вот это не понял - чем лучше? Т.е. где-нибудь может и по-другому выглядеть нативный body? Вот хотелось бы, конечно, не так, как у Стива. "Заманчивей" выглядит так, как сейчас, хотя если делать по-серьезному, типа безопасней ("по-взрослому"), то надо так, как Вы пишите. Сделаю "постным". ![]() Уже хочу - переделаю. Ну и я тогда также сделаю.
Ух, а что не так с массивом? P.S. Чуть позже отредактирую функцию там, где она уже есть (новых сообщений делать не буду). |
Автор: AKS 27.7.2007, 12:48 | ||||||
Zeroglif, надоело Вам тут уже в одной теме наверно, но я все же еще побеспокою, поскольку вопросец назрел серьезный. Вы говорите "у IE некоторые методы типа 'object'", и вместо равенства с 'function' выбрать 'string'. А как же тогда быть, если кто-нибудь сунет что-то без [[Call]]? Поместить вызов в try/catch? P.S. А может на предмет "передана ли исполняемая процедура?" проверять как-нибудь по такому принципу:
? Да тут еще с этими 'object' выясняется, что проверка на !aFunc.apply просто необходима...
Как-то так, пока:
|
Автор: Zeroglif 27.7.2007, 13:35 |
Зачем? Пусть ошибки лезут. Не суй в другой раз. ![]() aFunc имеет полное право тащить на себе левое свойство apply, Function.prototype - тоже, но там скорее всего или не будет ничего вообще, или будет уже готовая эмуляция. toString может быть некачественно реализован или переопределён. |
Автор: AKS 27.7.2007, 13:42 | ||||
Так, ясненько! Смотрите, как прикольно получается:
!!! ![]() Как же "присобачить" к возвратному значению ссылку на новое окно? В принципе, вернуть-то можно что угодно. ![]() ![]() Добавлено @ 13:47 Так, раз такое дело, то тогда так, наверно:
|
Автор: Zeroglif 27.7.2007, 13:56 |
Никак. И не нужно. Хочешь получить ссылку на окно - запускай хостовый метод так, чтобы поймать всё, что нужно (через свою функцию). |
Автор: smartov 27.7.2007, 14:15 | ||
Отож. Балакали балакали... |
Автор: AKS 27.7.2007, 14:16 |
Ну и хорошо - ничего лишнего, здоровая умеренность во всем! ![]() Вот как же быть с проверкой [native code] - хочется ведь получить родной метод или прервать выполнение кода... Отредактировал функцию на 2-ой стр. (27.7.2007, 18:39). |