jquery'de wait () veya sleep () işlevi?


101

Bir sınıf eklemek, 2 saniye beklemek ve başka bir sınıf eklemek istiyorum.

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

Herhangi bir yol var mı?

Yanıtlar:


187

setTimeout, belirli bir süre geciktikten sonra (milisaniye cinsinden ölçülür) bazı kodları çalıştırır. Bununla birlikte, önemli bir not: javascript'in doğası gereği, kodun geri kalanı zamanlayıcı kurulduktan sonra çalışmaya devam eder:

$('#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
bu şu anda kötü bir çözümdür çünkü .stop () gibi animasyon üzerinde jquery kontrolüne sahip olma avantajını kaybeder. çok daha iyi bir çözüm .delay ()
user151496

7
@ user123blahblah ... bu soru için PROPER çözümdür (animasyonla ilgisi yoktur). .delay animasyon kuyruğunun dışında jack fasulye yapar. Yanlış yorumunuzu destekleyenler, kendilerini yanlış yönlendirmişlerdir.
IncredibleHat

34

Olurdu .delay().

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

Eğer AJAX işi yapıyorsanız, gerçekten sadece otomatik olarak "bitti" yazmamalısınız, gerçekten bir yanıt beklemeli ve gerçekten yapılıp yapılmadığını görmelisiniz.


1
Ayrıca Steven, .removeClass('load')aksi takdirde her iki sınıfı da eklemenizi istersiniz , bu muhtemelen istenmeyen bir durumdur. Gerçekten eşzamansız bir eylemin tamamlanmasını bekliyorsanız, en iyi bahsiniz tamamlandığında ve başarılı olduğunda .addClass yapmaktır, eğer .addClass değilse ('hata') bir fikir olabilir
Gary Green

52
JQUery "delay ()" işlevi hiçbir şekilde genel amaçlı "bekleme" özelliği gibi bir şey sağlamaz. Animasyon sisteminin bir parçasıdır ve yalnızca animasyon kuyruğu için geçerlidir. İşlev her zaman hemen geri döner ve yürütme duraklamadan devam eder.
Sivri

22

delay () işi yapmaz. Delay () ile ilgili sorun, animasyon sisteminin bir parçasıdır ve yalnızca animasyon kuyrukları için geçerlidir.

Ya animasyonun dışında bir şey yürütmeden önce beklemek isterseniz ??

Bunu kullan:

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

Ne olur ?: Bu senaryoda, kaşlı ayraçlar içinde belirtilen kodu çalıştırmadan önce 600 milisaniye bekler.

Bu, çözdüğümde bana çok yardımcı oldu ve umarım sana da yardımcı olur!

ÖNEMLİ UYARI: 'window.setTimeout' eşzamansız olarak gerçekleşir. Kodunuzu yazarken bunu aklınızda bulundurun!


21

Bunun eski bir soru olduğunu anlayın, ancak bu sorunu çözmek için birisinin yararlı bulabileceği bir eklenti yazdım.

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

bunu yapmana izin ver:

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

2
Çok teşekkür ederim madlee!
phil294

2

Bir işlev var, ancak fazladan: http://docs.jquery.com/Cookbook/wait

Bu küçük parça beklemenizi sağlar:

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

2

.delay()Fonksiyonu kullanabilirsiniz .
Peşinde olduğun şey bu:

.addClass("load").delay(2000).addClass("done");

0

xml4jQuery eklentisi uyku (ms, geri arama) yöntemi verir. Kalan zincir uyku döneminden sonra yürütülecektir.

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

SetTimeout işlevini kullanarak, örneğin burayı ziyaret edin


21
Cevabınızın çoğu için bir bağlantıya güvenmemek en iyisi olarak kabul edilir
James Jenkins

6
@JamesJenkins yorumunu yedeklemek için, bunun nedeni bağlantıların her zaman güvenilir olmamasıdır. Bir kişi bir bağlantı ekleyecekse, cevabınıza kodun kendisini de dahil etmek en iyisidir.
Tass
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.