自分が所有していないライブラリコードと相互作用し、(合理的に)変更できないJavascriptを作成しています。一連の期間限定の質問で次の質問を表示するために使用されるJavascriptタイムアウトを作成します。これは、すべての希望を超えて難読化されているため、実際のコードではありません。ライブラリが行っていることは次のとおりです。
....
// 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によって作成されたタイマーに問い合わせることでいっぱいになるプログレスバーを画面に表示したいと思いますsetTimeout。唯一の問題は、これを行う方法がないように思われることです。getTimeout足りない機能はありますか?私が見つけることができるJavascriptタイムアウトに関する唯一の情報は、を介した作成とを介したsetTimeout( function, time)削除にのみ関連していclearTimeout( id )ます。
タイムアウトが発生するまでの残り時間、またはタイムアウトが呼び出されてからの経過時間を返す関数を探しています。プログレスバーコードは次のようになります。
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:javascript setTimeout()までの残り時間を見つけるにはどうすればよいですか?
これが私が今使っている解決策です。私はテストを担当するライブラリセクションを調べ、コードのスクランブルを解除しました(ひどい、そして私の許可に反して)。
// 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 );
これが私のコードです:
// setTimeoutのラッパー
関数mySetTimeout(func、timeout){
タイムアウト[n = setTimeout(func、timeout)] = {
開始:新しいDate()。getTime()、
終了:新しいDate()。getTime()+タイムアウト
t:タイムアウト
}
nを返します。
}
これは、IE 6以外のすべてのブラウザーでかなり正確に機能します。元のiPhoneでさえ、非同期になると思っていました。