css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
14 Окт
При проектировании интерфейсов пользователя когда-нибудь обязательно встанет задача использования таймеров, и в этой статье я хочу рассказать о замечательном плагине jQuery Timers, который значительно облегчит работу по созданию и применению таймеров в Ваших приложениях. jQuery Timers – это высокоуровневая абстракция методов setTimeout и setInterval. Используя jQuery Timers, Вы сможете «прикреплять» таймеры к элементам непосредственно в Вашем коде и использовать еще некоторые возможности.
Как обычно, сначала посмотрим пример, а потом разберем исходный код.
Пример №1 демонстрирует неуправляемый таймер, который просто отсчитывает секунды.
Пример №2 – таймер от 0 до 15 секунд с возможностью запуска и остановки.
Пример №3 – «одноразовый» таймер, который выполняет некую функцию по истечении определенного времени.
Примеры написаны таким образом, чтобы продемонстрировать работу всех трех методов, которые реализует плагин.
Вы можете скачать исходный код примера и воспроизвести этот пример на своем сайте.
* – в архиве не содержатся js-файлы, их можно скачать отдельно в разделе Download.
Нам потребуется подключить в раздел HEAD страницы несколько файлов: само собой разумеется библиотеку jQuery jquery-1.2.6.js и файл плагина jquery.timers.js
<script type="text/javascript" src="js/jquery-1.2.6.js"></script> <script type="text/javascript" src="js/jquery.timers.js"></script>
HTML и CSS-коды разбирать не имеет смысла – они слишком просты. Посмотреть их можно в исходнике. Подробнее разберем только js-код.
Итак, код примера №1:
$("#example_1").everyTime(1000, function(i) {
$(this).text(i);
});
Мы выбрали элемент с идентификатором #example_1 и «прикрепили» к нему таймер, который будет срабатывать каждые 1000 миллисекунд. Соответственно, каждую секунду будет отрабатывать функция, которая вставит в выбранный элемент очередную цифру. В примере мы передали методу только два обязательных аргумента. Есть еще и необязательные, но о них будет рассказано ниже.
Посмотрим код примера №2:
$("#start").click(function() {
$("#example_2").everyTime(1000, 'timer2', function(i) {
$(this).text(i);
}, 15);
});
$("#stop").click(function() {
$("#example_2").stopTime('timer2');
});
При клике на кнопке с идентификатором #start мы выбираем элемент с идентификатором #example_2 и вызываем уже знакомый нам метод everyTime. Но при этом передаем ему кроме обязательных аргументов, еше два. timer2 – это «метка» соответствующего таймера, а число 15 – количество раз, которое должен отработать таймер до остановки (если конечно раньше его не остановит какое-либо другое событие).
При клике на кнопке с идентификатором #stop мы снова выбираем элемент с идентификатором #example_2 и вызываем метод stopTime, передавая ему «метку» таймера, который должен быть остановлен.
И наконец пример №3:
$("#example_3").oneTime("30s", function() {
$(this).hide(2500);
});
«Одноразовый» таймер, который прикреплен к элементу с идентификатором #example_3. Первый аргумент – время, через которое будет вызвана соответствующая функция. Обратите внимание на такую «мелочь» – время может быть указано как в миллисекундах – 30000, так и в человекопонятном виде, просто – 30s.
А теперь более подробное описание всех трех методов.
everyTime(interval, [label], fn, [times], [belay])
в качестве аргументов метода everyTime выступает определение функции (fn : Function), как события, которое будет выполняться через определенные промежутки времени (interval : Integer | String), необходимое количество раз [times = 0 : Integer]. Если аргумент times установлен в 0, функция будет вызываться неограниченное количество раз. Аргумент [label = interval : String] – «метка» соответствующего таймера. [belay] – событие, возникающее, если предыдущая итерация по каким-то причинам была не завершена.
oneTime(interval, [label], fn)
в качестве аргументов метода oneTime выступает определение функции (fn : Function), которая будет вызвана через некоторый промежуток времени (interval : Integer | String) после того, как элемент будет добавлен в объект jQuery. Аргумент [label = interval : String] – «метка» соответствующего таймера.
stopTime([label], [fn])
метод останавливает выполнение всех событий, выполняемых по таймеру, имеющему соответствующую метку [label : Integer | String] и прекращает выполнение функций [fn : Function]. Если ни один из аргументов не передан, метод останавливает все выполняющиеся по таймеру события для элементов объекта jQuery. Если передан только аргумент [fn] – будут остановлены все события, вызывающие эту функцию независимо от метки. Наконец, если передан только аргумент [label] – будут остановлены все события, связанные с этой меткой при инициализации.
В заключение осталось только предоставить ссылку на страницу плагина jQuery Timers на официальном сайте jQuery и пожелать успешной работы.
Отзывов (22) на «Плагин jQuery Timers»
Спасибо. Очень полезный плагин. У меня будет использоваться для проверки новых сообщений на сайте
Намного удобнее, чем париться с setTimeOut, спасибо большое, уже пользую.
Оч полезный плагин, пасибо!
Подскажыте пожалуста как поступить.
Вот код
$(«#1″).everyTime(1000, function(i) {
$.getJSON(«/progo/licznik/index/», function(odp){
jQuery.each(odp, function(j) {
$(«#» + odp[j].id_towaru).text(odp[j].time);
$(«#x»+ odp[j].id_towaru).text(odp[j].x);
$(«#cena»+ odp[j].id_towaru).text(odp[j].cena);
});
});
});
Работает хорошо в Opera, Firefox i IE6. Но не работает в IE7
. Пробовал ставить «cache: false;», в функции $.getJSON(), не помогает

Что может быть не так? Как вы щитаете?
А в обратную сторону таймер не работает ?
Я имею ввиду 30,29,28,…….
И как можно очистить таймер опять на 0?
А какой смысл в этом? Или я не догоняю? Если знаешь с какой цифры начинать обратный отсчет до нуля, то не пофиг ли считать туда или обратно?
Пример:
После отправки форма она становится не активна , на , скажем 20 секунд.
Можно конечно написать так:
«Форма будет активна через 20 секунд».
И с боку пустить таймер от 0 до 20.
Но по моему намного красивее если будет так:
«Форма будет активна через «- здесь таймер от 20 и до 0 – «секунд».
Ну Вы уж право….
Отнимаете от 20 текущее значение таймера и выводите его – вот Вам и отсчет до 0.
Уж тоже спасибо скажу!
А как остановить время, на тот период, пока пользователь открывает другую страницу или другое приложение?
Вопрос – как остановить время? – согласитесь, звучит!
Таймер привязан к чему-то, к какому-то элементу на странице или хотя бы к объекту window. На другой странице – это уже другой таймер…
Вы хотите что-то вроде «сколько пользователь провел времени на сайте»? Тогда Вам запоминать значение по unload и с него стартовать таймер на новой странице по load.
прикольный плагин, а есть плагин обратного отсчета времени…тип до НГ иль ДР осталось стока то времени?
Добрый день!
Я так понимаю, данный скрипт работает «здесь и сейчас»? то есть от и до обновления страницы. Или есть возможность включить отсчет от определенной даты в прошлом?
Не очень понимаю, что такое «здесь и сейчас». Этот плагин для jQuery просто помогает создавать таймеры и управлять ими.
А для того чтобы сделать обратный отсчет например, надо просто немного пофантазировать…
Ну, например, кто мешает «определенную дату в прошлом» представить количеством секунд, прошедших с 1 января 1970 года? Текущую дату получить тоже не проблема, верно? Запускайте таймер с учетом разницы между этими величинами и, если надо, приводите в человекопонятный вид. И будет Вам отсчет от «даты в прошлом».
Подскажите, плз, как можно реализоваь задержку при вызове обработчика
$(document).ready(function(){
$(‘.topmenu ul li’)
$(‘.topmenu ul li’).hover(
function() {
$(this).addClass(«active»);
$(this).find(‘ul’).stop(true, true);
$(this).find(‘ul’).toggle(«slide», {direction:»left»}, 2000);
},
function() {
$(this).removeClass(«active»);
$(this).find(‘ul’).toggle(«slide», {direction:»left»}, 2000);
}
);
});
т.е. необходимо чтобы скрипт отработал через 1 сек после того как мышка наведена на объект
Я не очень понял Alexey, что Вы хотели добиться…
В частности не имеет смысла применять find(‘ul’), поскольку this в текущем контексте – набор элементов li (ну разве что у Вас по html-разметке внутри еще ul’ы есть…).
А вообще здесь не обязательно использовать таймер, можно построить задержку с помощью метода animate.
Что-то вроде этого:
$("li").hover( function() { $(this).animate({opacity: 0.9}, 1000, function(){ $(this).css("background-color","#f00"); }); }, function() { $(this).animate({opacity: 1}, 1000, function(){ $(this).css("background-color",""); }); } );Понятно, что это только пример, но смысл в том, чтобы использовать animate, изменяя что-то незначащее в настоящий момент (или даже не изменяя ничего), а по истечении времени заданного для эффекта вызывать callback-функцию, которая уже сделает дальнейшее…
Доброго времени суток!
Я согласен с предыдущим ответом, по поводу таймера, но увы, у меня к примеру стоит задача выводить меню только если курсор наведен на элемент => определенного времени, в противном случае не выводить. То есть, навел – запустился таймер, сработал, если свел раньше – обнулить таймер.
Использую такой код (вывод поля через highslide)
$(document).ready(function(){
$(‘a.ent’).hover(function(){hs.htmlExpand(this,{contentId:’ediv’, slideshowGroup:’navigation’, outlineType:’drop-shadow’});
},
function(){});
});
Но увы, сколько не пробовал вписать туда таймеры, не вышло. Буду крайне признателен за помощь.
Вобщем смог написать так:
$(document).ready(function(){
$(«a.communa»).hover(function(){
$(this).oneTime(1000, ‘timer2′, function() { hs.htmlExpand(this,{contentId:’communa’,slideshowGroup:’navigation’,targetX:null,targetY:’communa -23px’}); });
},
function(){ $(this).stopTime(‘timer2′); });
});
firebug ошибок не нашел, да и везде работает, единственное, что было бы не плохо если вы просмотрите код, может можно реализовать изящнее.
Еще раз скажу спасибо за то, что помогли найти решение кучи проблем! А Ваша книга стала настольной
Вопрос такой. Может ли этот плагин jQuery Timers помещать роботу Яндекс проиндексировать веб-страницу с этим плагином в разделе head?
Нет, Arthur, не может.
Обсуждение статьи можно продолжить на форуме jQuery.