hàm wait () hay sleep () trong jquery?


101

Tôi muốn thêm một lớp, đợi 2 giây và thêm một lớp khác.

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

Không có cách nào khác ư?

Câu trả lời:


186

setTimeout sẽ thực thi một số mã sau một khoảng thời gian trễ (tính bằng mili giây). Tuy nhiên, một lưu ý quan trọng: do bản chất của javascript, phần còn lại của mã tiếp tục chạy sau khi bộ hẹn giờ được thiết lập:

$('#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
đây là một giải pháp kém ở thời điểm hiện tại vì nó mất đi lợi thế của việc kiểm soát jquery đối với hoạt ảnh, như .stop (). giải pháp tốt hơn nhiều là .delay ()
user151496

7
@ user123blahblah ... đây là PROPER giải pháp cho câu hỏi (mà không có gì để làm với hình ảnh động). .delay không đậu jack bên ngoài hàng đợi hoạt ảnh. Bất kỳ ai ủng hộ nhận xét sai lầm của bạn, đều là đánh lừa chính họ.
IncredibleHat

34

Đó sẽ là .delay().

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

Nếu bạn đang làm AJAX những thứ tho, bạn thực sự không nên chỉ tự động viết "xong", bạn thực sự nên đợi phản hồi và xem nó có thực sự hoàn thành hay không.


1
Ngoài ra Steven bạn muốn .removeClass('load')nếu không thì việc thêm cả hai lớp của bạn tải và hoàn thành, điều này có thể không mong muốn. Nếu bạn đang thực sự chờ đợi một hành động không đồng bộ để hoàn thành, đặt cược tốt nhất của bạn là để làm .addClass KHI nó hoàn thành và thành công, nếu không muốn nói .addClass ( 'lỗi') có thể là một ý tưởng
Gary Xanh

52
Hàm jQUery "delay ()" không có cách nào cung cấp bất cứ thứ gì giống như một phương tiện "chờ" có mục đích chung. Nó là một phần của hệ thống hoạt ảnh và chỉ áp dụng cho hàng đợi hoạt ảnh. Hàm luôn trả về ngay lập tức và quá trình thực thi vẫn tiếp tục mà không cần tạm dừng.
Pointy

22

delay () sẽ không thực hiện công việc. Vấn đề với delay () là nó là một phần của hệ thống hoạt ảnh và chỉ áp dụng cho hàng đợi hoạt ảnh.

Điều gì sẽ xảy ra nếu bạn muốn đợi trước khi thực hiện một cái gì đó bên ngoài hoạt ảnh ??

Dùng cái này:

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

Điều gì xảy ra ?: Trong trường hợp này, nó đợi 600 mili giây trước khi thực thi mã được chỉ định trong dấu ngoặc nhọn.

Điều này đã giúp tôi rất nhiều khi tôi tìm ra nó và hy vọng nó cũng sẽ giúp bạn!

LƯU Ý QUAN TRỌNG: 'window.setTimeout' xảy ra không đồng bộ. Hãy ghi nhớ điều đó khi viết mã của bạn!


20

Nhận ra rằng đây là một câu hỏi cũ, nhưng tôi đã viết một plugin để giải quyết vấn đề này mà ai đó có thể thấy hữu ích.

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

cho phép bạn làm điều này:

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

2
Cảm ơn madlee rất nhiều!
phil294,

2

Có một chức năng, nhưng nó bổ sung: http://docs.jquery.com/Cookbook/wait

Đoạn mã nhỏ này cho phép bạn đợi:

$.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

Plugin xml4jQuery cung cấp phương thức sleep (ms, callback). Chuỗi còn lại sẽ được thực hiện sau thời gian ngủ.

$(".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>


-1

Sử dụng hàm setTimeout, chẳng hạn như Truy cập vào đây chẳng hạn


21
Nó được coi là tốt nhất để không phụ thuộc vào một liên kết cho phần lớn các câu trả lời của bạn
James Jenkins

6
Để sao lưu nhận xét của @JamesJenkins, điều này là do các liên kết không phải lúc nào cũng đáng tin cậy. Nếu một người muốn thêm một liên kết, thì tốt nhất bạn cũng nên đưa chính mã vào câu trả lời của mình.
Tass
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.