Как ждать 5 секунд с jQuery?

404

Я пытаюсь создать эффект, когда страница загружается, и через 5 секунд сообщение об успехе на экране исчезает или перемещается вверх.

Как мне этого добиться?

Эндрю
источник

Ответы:

733

Встроенный javascript setTimeout .

setTimeout(
  function() 
  {
    //do something special
  }, 5000);

ОБНОВЛЕНИЕ : вы хотите подождать с момента окончания загрузки страницы, поэтому поместите этот код в ваш $(document).ready(...);скрипт.

ОБНОВЛЕНИЕ 2 : jquery 1.4.0 представил .delayметод. Проверьте это . Обратите внимание, что .delay работает только с очередями эффектов jQuery.

Алекс Баньолини
источник
2
Есть ли в jQuery что-то, что вы можете использовать вместо setTimeout?
Эндрю
37
JQuery написан на JavaScript. Если вы включаете и используете jQuery, вам нужен javascript. Если у вас есть JavaScript, у вас есть setTimeout.
Алекс Баньолини
4
Да, я знаю. Я имею в виду, что $ ('. Message'). Wait (5000) .slideUp (); было бы намного приятнее. но я не думаю, что функция wait () существует.
Эндрю
18
.delay (5000) пород
demoncodemonkey
66
Просто sidenote - .delay работает только с очередями эффектов jQuery, поэтому он идеально подходит для слайдов и замирания, подобных этому. Мне потребовалось некоторое время, чтобы понять, что это не работает для других вещей, которые вы можете сделать с помощью jQuery.
Джоэл Бекхэм
61

Используйте обычный таймер JavaScript:

$(function(){
   function show_popup(){
      $("#message").slideUp();
   };
   window.setTimeout( show_popup, 5000 ); // 5 seconds
});

Это будет ждать 5 секунд после того, как DOM будет готов. Если вы хотите подождать, пока страница действительно loadedне появится, вам нужно использовать это:

$(window).load(function(){
   function show_popup(){
      $("#message").slideUp();
   };
   window.setTimeout( show_popup, 5000 ); // 5 seconds
})

РЕДАКТИРОВАТЬ: В ответ на комментарий ОП спрашивает, есть ли способ сделать это в jQuery и не использовать setTimeoutответ «нет». Но если вы хотите сделать его более «jQueryish», вы можете обернуть его так:

$.wait = function( callback, seconds){
   return window.setTimeout( callback, seconds * 1000 );
}

Вы могли бы тогда назвать это так:

$.wait( function(){ $("#message").slideUp() }, 5);
Дуг Нейнер
источник
44

Я столкнулся с этим вопросом, и я думал, что предоставлю обновление по этой теме. jQuery (v1.5 +) включает Deferredмодель, которая (несмотря на то , что она не придерживалась спецификации Promises / A до jQuery 3) обычно рассматривается как более четкий способ решения многих асинхронных задач. Реализация $.wait()метода с использованием этого подхода особенно читабельна, я считаю:

$.wait = function(ms) {
    var defer = $.Deferred();
    setTimeout(function() { defer.resolve(); }, ms);
    return defer;
};

И вот как вы можете использовать это:

$.wait(5000).then(disco);

Однако, если после паузы вы хотите выполнять действия только с одним выбором jQuery, то вы должны использовать нативный jQuery, .delay()который, как я считаю, также использует Deferred под капотом:

$(".my-element").delay(5000).fadeIn();
Ян Кларк
источник
1
Ян Кларк - это супер потрясающее решение! Мне это очень нравится, и я буду использовать его в своих проектах. Спасибо!
Антон Данильченко
Не знаю, почему этот короткий кусок кода не работает
MR_AMDEV
26
setTimeout(function(){


},5000); 

Разместите свой код внутри { }

300 = 0.3 seconds

700 = 0.7 seconds

1000 = 1 second

2000= 2 seconds

2200 = 2.2 seconds

3500 = 3.5 seconds

10000 = 10 seconds

и т.п.

maudulus
источник
7
Чем это отличается от принятого ответа ?
Тунаки
2
форматирование / синтаксис, и это дает больше разъяснений по времени.
maudulus
17

Используете это для наложения сообщений, которое может быть немедленно закрыто по щелчку или оно выполнит автозаполнение через 10 секунд.

button = $('.status-button a', whatever);
if(button.hasClass('close')) {
  button.delay(10000).queue(function() {
    $(this).click().dequeue();
  });
}
Джо Хасенау
источник
1
+10, это должен быть правильный ответ, .delay()и он может быть вложенным
wpcoder
9

Библиотека Underscore также предоставляет функцию «задержки»:

_.delay(function(msg) { console.log(msg); }, 5000, 'Hello');
izilotti
источник
6

Основываясь на ответе Джои, я придумал предполагаемое (от jQuery, прочитанное о «очереди») решение.

Он в некоторой степени соответствует синтаксису jQuery.animate () - позволяет связывать его с другими функциями fx, поддерживает «медленный» и другие jQuery.fx.speeds, а также является полностью jQuery. И будет обрабатываться так же, как анимации, если вы их остановите.

Тестовую площадку jsFiddle с большим количеством применений (например, показом .stop ()) можно найти здесь .

Суть решения:

$('<queue/>')
.delay(100 /*ms*/)
.queue( (next) => { $('#result').text('done.'); next(); } );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

все как плагин, поддерживающий использование $ .wait () и $ (..). wait ():

// add wait as $.wait() standalone and $(elem).wait() for animation chaining
(function($) {

  $.wait = function(duration, completeCallback, target) {
    $target = $(target || '<queue />');
    return $target.delay(duration).queue(function(next){completeCallback && completeCallback.call($target); next();});
  }

  $.fn.wait = function(duration, completeCallback) {
    return $.wait.call(this, duration, completeCallback, this);
  };

})(jQuery);

//TEST
$(function() {

  // stand alone
  $.wait(1000, function() {
    $('#result')
    .append('...done');
  });

  // chained
  $('#result')
  .append('go...')
  .wait('slow', function() {
    $(this).append('after slow');
  })
  .css({color: 'green'});
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

Примечание: поскольку ожидание добавляет в стек анимации, $ .css () выполняется немедленно - как и предполагалось: ожидаемое поведение jQuery.

BananaAcid
источник
1
$( "#foo" ).slideUp( 300 ).delay( 5000 ).fadeIn( 400 );
MAK
источник
1

Поймите, что это старый вопрос, но я написал плагин для решения этой проблемы, который кто-то может найти полезным.

https://github.com/madbook/jquery.wait

позволяет вам сделать это:

$('#myElement').addClass('load').wait(2000).addClass('done');
desbest
источник