จะรอ 5 วินาทีกับ jQuery ได้อย่างไร


404

ฉันพยายามสร้างเอฟเฟกต์ที่หน้าโหลดและหลังจาก 5 วินาทีข้อความความสำเร็จบนหน้าจอจะจางหายไปหรือเลื่อนขึ้น

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

คำตอบ:


732

สร้างขึ้นในจาวาสคริปต์setTimeout

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

อัปเดต : คุณต้องการรอตั้งแต่เมื่อโหลดหน้าเสร็จแล้วดังนั้นให้วางโค้ดนั้นไว้ใน$(document).ready(...);สคริปต์ของคุณ

ปรับปรุง 2 : jQuery 1.4.0 แนะนำ.delayวิธีการ ลองดูสิ โปรดทราบว่า. delay ใช้ได้เฉพาะกับคิวเอฟเฟกต์ jQuery เท่านั้น


2
มี jQuery อะไรบ้างที่คุณสามารถใช้แทนที่จะใช้ setTimeout
Andrew

37
jQuery เขียนด้วย javascript หากคุณรวมและใช้ jQuery คุณต้องมีจาวาสคริปต์ ถ้าคุณมี javascript, setTimeoutคุณมี
Alex Bagnolini

4
ใช่ฉันรู้. ฉันหมายความว่า $ ('. message'). รอ (5,000) .slideUp (); จะดีกว่ามาก แต่ฉันไม่คิดว่าจะมีฟังก์ชั่น wait () อยู่
Andrew

18
.delay (5000) โขดหิน
demoncodemonkey

66
แค่ sidenote - .Delay ใช้ได้เฉพาะกับคิวเอฟเฟกต์ jQuery เท่านั้นจึงเหมาะสำหรับสไลด์และจางหายเช่นนี้ ฉันต้องใช้เวลาสักพักกว่าจะรู้ว่ามันใช้ไม่ได้กับสิ่งอื่น ๆ ที่คุณสามารถทำได้ด้วย jQuery
Joel Beckham

61

ใช้ตัวจับเวลาจาวาสคริปต์ปกติ:

$(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
})

แก้ไข:ในการตอบความคิดเห็นของ OP ถามว่ามีวิธีที่จะทำใน jQuery และไม่ได้ใช้setTimeoutคำตอบคือไม่มี แต่ถ้าคุณต้องการทำให้มากขึ้น "jQueryish" คุณสามารถสรุปได้ดังนี้:

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

จากนั้นคุณสามารถเรียกสิ่งนี้ได้:

$.wait( function(){ $("#message").slideUp() }, 5);

44

ฉันวิ่งข้ามคำถามนี้และฉันคิดว่าฉันจะให้การปรับปรุงในหัวข้อนี้ jQuery (v1.5 +) รวมถึงDeferredรูปแบบซึ่ง(แม้จะไม่ได้ปฏิบัติตามข้อกำหนด/ สัญญาจนกว่า jQuery 3) จะถือว่าเป็นวิธีที่ชัดเจนกว่าในการจัดการกับปัญหาแบบอะซิงโครนัสจำนวนมาก การใช้$.wait()วิธีการโดยใช้วิธีนี้สามารถอ่านได้โดยเฉพาะฉันเชื่อว่า:

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

และนี่คือวิธีการใช้งาน:

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

อย่างไรก็ตามหากหลังจากหยุดชั่วคราวคุณต้องการที่จะดำเนินการกับการเลือก jQuery เดียวจากนั้นคุณควรใช้ภาษาพื้นเมืองของ jQuery .delay()ซึ่งฉันเชื่อว่าจะใช้ Deferred's ภายใต้ประทุน:

$(".my-element").delay(5000).fadeIn();

1
เอียนคลาร์ก - มันเป็นทางออกที่ยอดเยี่ยมมาก! ฉันชอบมันมากและจะใช้มันในโครงการของฉัน ขอบคุณ!
Anton Danilchenko

ไม่ทราบสาเหตุที่รหัสสั้น ๆ นี้ใช้งานไม่ได้
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

เป็นต้น


7
สิ่งนี้แตกต่างจากคำตอบที่ยอมรับได้อย่างไร
Tunaki

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


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 ที่คาดไว้



1

ตระหนักว่านี่เป็นคำถามเก่า แต่ฉันเขียนปลั๊กอินเพื่อแก้ไขปัญหานี้ซึ่งบางคนอาจพบว่ามีประโยชน์

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

ให้คุณทำสิ่งนี้:

$('#myElement').addClass('load').wait(2000).addClass('done');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.