Bagaimana cara menunggu 5 detik dengan jQuery?

404

Saya mencoba membuat efek di mana halaman dimuat, dan setelah 5 detik, pesan sukses di layar memudar, atau meluncur.

Bagaimana saya bisa mencapai ini?

Andrew
sumber

Jawaban:

733

Dibangun pada setTimeout javascript .

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

UPDATE : Anda ingin menunggu sejak saat halaman selesai memuat, jadi letakkan kode itu di dalam $(document).ready(...);skrip Anda .

UPDATE 2 : jquery 1.4.0 memperkenalkan .delaymetode ini. Lihat itu . Perhatikan bahwa .delay hanya berfungsi dengan antrian efek jQuery.

Alex Bagnolini
sumber
2
apakah ada sesuatu di jQuery yang bisa Anda gunakan daripada menggunakan setTimeout?
Andrew
37
jQuery ditulis dalam javascript. Jika Anda memasukkan dan menggunakan jQuery, Anda perlu javascript. Jika Anda memiliki javascript, Anda punya setTimeout.
Alex Bagnolini
4
Ya aku tahu. Maksud saya $ ('. Message'). Wait (5000) .slideUp (); akan jauh lebih baik. tapi saya rasa fungsi wait () tidak ada.
Andrew
18
.delay (5000) rocks
demoncodemonkey
66
Hanya sidenote - .delay hanya berfungsi dengan antrian efek jQuery, jadi sangat cocok untuk slide dan fades seperti ini. Butuh beberapa saat untuk menyadari bahwa itu tidak berfungsi untuk hal lain yang dapat Anda lakukan dengan jQuery.
Joel Beckham
61

Gunakan penghitung javascript biasa:

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

Ini akan menunggu 5 detik setelah DOM siap. Jika Anda ingin menunggu sampai halaman tersebut sebenarnya loadedAnda perlu menggunakan ini:

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

EDIT: Sebagai jawaban atas komentar OP yang menanyakan apakah ada cara untuk melakukannya di jQuery dan tidak menggunakan setTimeoutjawabannya tidak. Tetapi jika Anda ingin membuatnya lebih "jQueryish" Anda bisa membungkusnya seperti ini:

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

Anda dapat menyebutnya seperti ini:

$.wait( function(){ $("#message").slideUp() }, 5);
Doug Neiner
sumber
44

Saya menemukan pertanyaan ini dan saya pikir saya akan memberikan pembaruan tentang topik ini. jQuery (v1.5 +) termasuk Deferredmodel, yang (meskipun tidak mematuhi spesifikasi Janji / A sampai jQuery 3) umumnya dianggap sebagai cara yang lebih jelas untuk mendekati banyak masalah asinkron. Menerapkan $.wait()metode menggunakan pendekatan ini sangat mudah dibaca saya percaya:

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

Dan inilah cara Anda dapat menggunakannya:

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

Namun jika, setelah jeda, Anda hanya ingin melakukan tindakan pada satu pilihan jQuery, maka Anda harus menggunakan asli jQuery .delay()yang saya percaya juga menggunakan Deferred's under the hood:

$(".my-element").delay(5000).fadeIn();
Ian Clark
sumber
1
Ian Clark - ini solusi super luar biasa! Saya sangat menyukainya dan akan menggunakannya dalam proyek saya. Terima kasih!
Anton Danilchenko
Tidak tahu mengapa kode pendek ini tidak berfungsi
MR_AMDEV
26
setTimeout(function(){


},5000); 

Tempatkan kode Anda di dalam { }

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

dll.

maudulus
sumber
7
Bagaimana ini berbeda dari jawaban yang diterima ?
Tunaki
2
pemformatan / sintaksis dan itu memberikan klarifikasi yang lebih besar pada waktu
maudulus
17

Telah menggunakan yang ini untuk hamparan pesan yang dapat ditutup segera pada klik atau melakukan autoclose setelah 10 detik.

button = $('.status-button a', whatever);
if(button.hasClass('close')) {
  button.delay(10000).queue(function() {
    $(this).click().dequeue();
  });
}
Jo Hasenau
sumber
1
+10, ini seharusnya jawaban yang tepat, .delay()dan bisa disarangkan
wpcoder
9

The Menggarisbawahi perpustakaan juga menyediakan "penundaan" fungsi:

_.delay(function(msg) { console.log(msg); }, 5000, 'Hello');
izilotti
sumber
6

Berdasarkan jawaban Joey, saya datang dengan solusi yang dimaksud (oleh jQuery, baca tentang 'antrian').

Ini agak mengikuti sintaks jQuery.animate () - memungkinkan untuk dirantai dengan fungsi fx lainnya, mendukung 'lambat' dan jQuery.fx.speed lainnya serta sepenuhnya jQuery. Dan akan ditangani dengan cara yang sama seperti animasi, jika Anda menghentikannya.

jsFiddle test ground dengan lebih banyak penggunaan (seperti memamerkan .stop ()), dapat ditemukan di sini .

inti dari solusinya adalah:

$('<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>

keseluruhan sebagai plugin, mendukung penggunaan $ .wait () dan $ (..). 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>

Catatan: karena menunggu ditambahkan ke tumpukan animasi, $ .css () dieksekusi segera - seperti yang seharusnya: perilaku jQuery yang diharapkan.

BananaAcid
sumber
1
$( "#foo" ).slideUp( 300 ).delay( 5000 ).fadeIn( 400 );
mak
sumber
1

Sadarilah bahwa ini adalah pertanyaan lama, tetapi saya menulis sebuah plugin untuk mengatasi masalah ini yang mungkin bermanfaat bagi seseorang.

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

memungkinkan Anda melakukan ini:

$('#myElement').addClass('load').wait(2000).addClass('done');
desbest
sumber