ฟังก์ชั่น wait () หรือ sleep () ใน jquery?


103

ฉันต้องการเพิ่มชั้นเรียนรอ 2 วินาทีแล้วเพิ่มชั้นเรียนอื่น

.addClass("load").wait(2sec).addClass("done");

มีวิธีใดบ้าง?

คำตอบ:


189

setTimeout จะรันโค้ดบางส่วนหลังจากล่าช้าไปช่วงเวลาหนึ่ง (วัดเป็นมิลลิวินาที) อย่างไรก็ตามหมายเหตุสำคัญ: เนื่องจากลักษณะของจาวาสคริปต์โค้ดส่วนที่เหลือยังคงทำงานต่อไปหลังจากตั้งค่าตัวจับเวลา:

$('#someid').addClass("load");

setTimeout(function(){
  $('#someid').addClass("done");
}, 2000);

// Any code here will execute immediately after the 'load' class is added to the element.

2
นี่เป็นวิธีแก้ปัญหาที่ไม่ดีในขณะนี้เนื่องจากสูญเสียข้อได้เปรียบในการควบคุม jquery เหนือภาพเคลื่อนไหวเช่น .stop () ทางออกที่ดีกว่ามากคือ. delay ()
user151496

7
@ user123blahblah ... นี่คือคำตอบที่เหมาะสมสำหรับคำถาม (ซึ่งไม่มีส่วนเกี่ยวข้องกับภาพเคลื่อนไหว) .delay ทำถั่วแจ็คนอกคิวอนิเมชั่น ใครก็ตามที่ยกระดับความคิดเห็นที่ผิดพลาดของคุณจะถูกทำให้เข้าใจผิด
IncredibleHat

34

.delay()ที่ต้องการจะ

http://api.jquery.com/delay/

หากคุณกำลังทำสิ่งต่างๆของ AJAX คุณไม่ควรเขียนว่า "เสร็จสิ้น" โดยอัตโนมัติจริงๆคุณควรรอการตอบกลับและดูว่าทำได้จริงหรือไม่


1
นอกจากนี้คุณยังต้องการให้สตีเวน.removeClass('load')เพิ่มการเพิ่มคลาสทั้งสองแบบซึ่งอาจไม่เป็นที่ต้องการ หากคุณกำลังรอให้การดำเนินการแบบอะซิงโครนัสเสร็จสมบูรณ์ทางออกที่ดีที่สุดของคุณคือทำ. addClass เมื่อเสร็จสมบูรณ์และประสบความสำเร็จถ้าไม่ใช่. addClass ('error') อาจเป็นความคิด
Gary Green

52
ฟังก์ชัน jQUery "delay ()" ไม่ได้ให้อะไรเหมือนกับสิ่งอำนวยความสะดวก "wait" ที่ใช้งานทั่วไป เป็นส่วนหนึ่งของระบบภาพเคลื่อนไหวและใช้กับคิวภาพเคลื่อนไหวเท่านั้น ฟังก์ชันจะส่งคืนทันทีเสมอและการดำเนินการจะดำเนินต่อไปโดยไม่หยุดชั่วคราว
Pointy

22

ล่าช้า () จะไม่ทำงาน ปัญหาเกี่ยวกับความล่าช้า () เป็นส่วนหนึ่งของระบบภาพเคลื่อนไหวและใช้กับคิวภาพเคลื่อนไหวเท่านั้น

ถ้าคุณต้องการรอก่อนที่จะดำเนินการบางอย่างนอกภาพเคลื่อนไหว ??

ใช้สิ่งนี้:

window.setTimeout(function(){
                 // do whatever you want to do     
                  }, 600);

จะเกิดอะไรขึ้น: ในสถานการณ์นี้จะรอ 600 มิลลิวินาทีก่อนที่จะดำเนินการตามรหัสที่ระบุไว้ในวงเล็บปีกกา

สิ่งนี้ช่วยฉันได้มากเมื่อฉันคิดออกและหวังว่ามันจะช่วยคุณได้เช่นกัน!

ประกาศที่สำคัญ: 'window.setTimeout' เกิดขึ้นแบบอะซิงโครนัส โปรดจำไว้ว่าเมื่อเขียนโค้ดของคุณ!


21

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

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

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

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

2

มีฟังก์ชั่น แต่พิเศษ: http://docs.jquery.com/Cookbook/wait

ตัวอย่างเล็ก ๆ น้อย ๆ นี้ให้คุณรอ:

$.fn.wait = function(time, type) {
    time = time || 1000;
    type = type || "fx";
    return this.queue(type, function() {
        var self = this;
        setTimeout(function() {
            $(self).dequeue();
        }, time);
    });
};


0

ปลั๊กอิน xml4jQuery ให้เมธอด sleep (ms, callback) โซ่ที่เหลือจะถูกดำเนินการหลังจากช่วงเวลาพักเครื่อง

$(".toFill").html("Click here")
                .$on('click')
                .html('Loading...')
                .sleep(1000)
                .html( 'done')
                .toggleClass('clickable')
                .prepend('Still clickable <hr/>');
.toFill{border: dashed 2px palegreen; border-radius: 1em; display: inline-block;padding: 1em;}
        .clickable{ cursor: pointer; border-color: blue;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
   <script type="text/javascript" src="https://cdn.xml4jquery.com/ajax/libs/xml4jquery/1.1.2/xml4jquery.js"></script>
        <div class="toFill clickable"></div>

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