Sahip olmadığım ve (makul bir şekilde) değiştiremediğim kütüphane koduyla etkileşime giren bir Javascript yazıyorum. Bir sonraki soruyu bir dizi zaman sınırlı soruda göstermek için kullanılan Javascript zaman aşımlarını oluşturur. Bu gerçek bir kod değildir, çünkü tüm umutların ötesinde gizlenmiştir. İşte kütüphanenin yaptığı şey:
....
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = setTimeout( showNextQuestion(questions[i+1]), t );
questionTime * 1000
Oluşturduğu zamanlayıcıyı sorgulayarak ekrana doğru dolduran bir ilerleme çubuğu koymak istiyorum setTimeout
. Tek sorun, bunu yapmanın bir yolu yok gibi görünüyor. Kaçırdığım bir getTimeout
işlev var mı ? Javascript zaman aşımlarıyla ilgili bulabildiğim tek bilgi, yalnızca aracılığıyla oluşturma setTimeout( function, time)
ve aracılığıyla silme ile ilgili clearTimeout( id )
.
Bir zaman aşımı tetiklenmeden önce kalan süreyi veya bir zaman aşımı çağrıldıktan sonra geçen süreyi döndüren bir işlev arıyorum. İlerleme barkodum şöyle görünüyor:
var timeleft = getTimeout( test.currentTimeout ); // I don't know how to do this
var $bar = $('.control .bar');
while ( timeleft > 1 ) {
$bar.width(timeleft / test.defaultQuestionTime * 1000);
}
tl; dr: Bir javascript setTimeout () öncesinde kalan süreyi nasıl bulabilirim?
İşte şimdi kullandığım çözüm. Testlerden sorumlu kütüphane bölümünden geçtim ve kodu çözdüm (korkunç ve izinlerime aykırı).
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = mySetTimeout( showNextQuestion(questions[i+1]), t );
ve işte kodum:
// setTimeout için sarmalayıcı function mySetTimeout (func, timeout) { zaman aşımı [n = setTimeout (func, timeout)] = { başlangıç: yeni Date (). getTime (), end: new Date (). getTime () + zaman aşımı t: zaman aşımı } dönüş n; }
Bu, IE 6 olmayan herhangi bir tarayıcıda oldukça yerinde çalışıyor. İşlerin zaman uyumsuz olmasını beklediğim orijinal iPhone bile.