• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JavaScriptのsetTimeoutについて)

JavaScriptのsetTimeoutのタイマー処理についての調査結果

このQ&Aのポイント
  • JavaScriptのsetTimeout関数は、指定した時間(ミリ秒)後にコールバック関数を実行するタイマー処理を行います。
  • タイマー処理は、ブラウザごとに異なる実装があります。
  • Firefoxでは、setTimeoutのコールバック関数は専用のタイマースレッドで実行されるため、alert関数が呼ばれた際にもタイマーカウントが進行します。一方、IEやChromeでは、setTimeoutのコールバック関数はメインスレッドで実行されるため、alert関数を呼び出すとタイマーカウントが一時停止します。

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

alertは時を止める魔法 JavaScriptとの動作はブラウザごとに実装されているので 動作が違うものがあっても文句言いたいけどそういうものだと受け止めるしか こちらにも同じような検証している方がいるので 良かったら参考にしてください http://andante0727.blog81.fc2.com/blog-entry-22.html

mokpok
質問者

お礼

ありがとうございます。 タイマースレッドについての挙動を調べて頂けなので、 ブラウザごとの相違がalertだけなら問題なしです。 実験ぐらいにしか使わないですし・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javascriptのストップウオッチのコード

    javascript初級勉強中です。 以下のコードを実行すると(1)小数点第2の動きがおかしい。  (2)一度リセットボタンを押さないとタイマーが動かない。 という2点の不具合が出ます。   どうすれば解決するでしょうか? <!DOCTYPE HTML> <head> <meta charset="utf-8"> <title>ストップウォッチ</title> </head> <body> <h1>ストップウオッチ</h1> <div id="sec" style="font-size:128px">0.00</div> <input type="button" value="Start!" onclick="run();"> <input type="button" value="Stop!" onclick="stop();"> <input type="button" value="Reset!" onclick="reset();"> <script> var statTime, stopTime, running = false, timerId; function run() { if (running)return; running = true; if (stopTime) { startTime = startTime + (new Date()).getTime() - stopTime; } if (! startTime) { startTime = (new Date()).getTime(); } timer(); //タイマー処理回していく } function timer() { document.getElementById('sec').innerHTML = (((new Date()).getTime()- startTime)/1000). toFixed(2); timerId =setTimeout(function() { timer(); //このタイマー自身を回していく }, 100); } function stop() { if (!running) return false; running = false; clearTimeout(timerId); //timerIdを渡して止める stopTime = (new Date()).getTime(); } function reset() { if (running) return;   startTime = undefined; document.getElementById('sec').innerHTML = '0.00'; } </script> </body> </html>

  • setTimeout の動作不良?

    setTimeout の中で引用する関数が引用するカッコの中に 引用符で文字列を入れると正常に作動しますが 変数名を入れると、動作が停止してしまうようです。 Win 7 pro 上で、Firefox 、 IE11 の両方で試しましたが どちらも動きませんでした。 おそらく、setTimeout のバグではないかと個人的に考えていますが どのようにして、この問題を解決可能かを 教えて下さい。 <script> function TestA() { setTimeout( "alert('Hello')", 2000) ; } function TestQuote() { var stringQ = 'Hello' setTimeout( "alert(stringQ)", 2000) ; } function TestNoQuote() { var stringQ = 'Hello' setTimeout( alert(stringQ), 2000) ; } </script> </head> <body> <button onclick="TestA()" > Timer 1 </button> <button onclick="TestQuote()" > Timer 2 </button> <button onclick="TestNoQuote()" > Timer 3 </button>

  • setTimeoutを使った再帰

    初めて質問させて頂きます。 setTimeoutで呼び出してるか否かと、言う違いしか無いと、言う事を思いますが、次に挙げる2つのプログラムの動作が異なる理由をどなたかお教え頂けませんか? <script type="text/javascript"> <!-- var x; function FUNCTION1(){ x = 0; FUNCTION2(x); } function FUNCTION2(x){ if ( x < 10 ) { x++; window.alert(x); FUNCTION2(x); } } //--> </script> <body onload="javascript: FUNCTION1();"> ─────────────────────────── <script type="text/javascript"> <!-- var x; function FUNCTION1(){ x = 0; FUNCTION2(x); } function FUNCTION2(x){ if ( x < 10 ) { x++; window.alert(x); setTimeout("javascript: FUNCTION2(x);", 1000); } } //--> </script> <body onload="javascript: FUNCTION1();">

  • useless setTimeout cal 

    すみません。教えて下さい。 下のコードを書いて、動きはするんですが、実行後に 「useless setTimeout cal」というエラーが出てしまいます。 エラーを回避したいのですが、どうすればいいのでしょうか。 IE6/IE8/firefox3.6 などで試しました *********************************** <html> <head> <script type = 'text/javascript'> function item(){ var i = 0; write(); function write(){ document.write(i+"<br>"); i ++; if(i<10){setTimeout(write(),100);} } } </script> </head> <body> <script type = 'text/javascript'>item();</script> </body> <html> ***********************************

  • setTimeoutあるいはsetIntervalの限界

    いつもお世話になっています。 タイマーの実験をしてみようかと思い、タイマー関数のサンプルをちょっと触ってみて、気になることがありました。 スクリプトとしては、次のようなものです。 <HTML> <HEAD> <SCRIPT Language="JavaScript"> <!-- timerID = 10; count = 0; function timerX(){ status = "Counter is " + count++; } function clr(){ clearInterval(timerID); } // --> </SCRIPT> <BODY bgColor="white" onLoad="timerID = setInterval('timerX()',1000);"> (以下略) このスクリプトを実行すると、1秒毎に1カウント増えていきますから、ステータスに表示される数値は10秒で10になります。 ですから、1を指定する、つまりsetInterval('timerX()',1);にすれば、論理上、10秒で10000になるはずですよね? ところが実際にステータスに出る数値はそうはならず、かなり低い数字になってしまいます。 そこで質問なのですが、setTimeoutまたはsetIntervalでタイマーを作る場合、ミリ秒はどのくらいまで有効なのでしょうか。 ひょっとして、マシンに依存するのでまちまちなのでしょうか。 経験等でご存じの方、お教えください。

  • ある環境のみinputタグが複数あると物凄い重い原因

    ある環境で、inputタグが5000程あった場合に表示に20秒以上かかってしまいます。 同じhtmlを他の環境で読み込んだ場合には1秒かからず表示されるため、環境依存であるのは間違いないのですがその原因となり得る条件を知りたいと思っています。 正確に言うならば 下記のHTMLを読み込む ↓ onLoadのjavascriptが実行(alertの秒数は1秒未満) ↓ ボタンをクリックしようとする ↓ alert表示(20秒前後) 環境 OS:WindowsXP Pro (Windowsアップデートは全て実施済み) ブラウザ:IE Version: 6.0.2900.2180 試した事 ・typeをtext、radioに変更 ・javascriptを除去 ・hiddenをコメント化(普通のスピードで表示) ↓読み込ませたHTML <html> <head> <title></title> <script> startTime = new Date(); function testfunc() { time = new Date(); alert('経過時間' + (time - startTime)/1000 + '秒') startTime = time; } </script> </head> <body onLoad="testfunc()"> <input type="button" value="CLICK ME" onclick="testfunc();"/> <input type="hidden" name="A1" value=""/> <input type="hidden" name="A2" value=""/> ・ ・ ・ <input type="hidden" name="A5000" value=""/> </body> </html>

  • SetTimeoutの無効化について

    Flash初心者ですが、よろしくお願いします。 SetTimeoutを使って、30秒たつと別のシーンにとぶように設定したswfを作っています。 配置しているボタンを押した時など、30秒たつ前にシーンが変わった場合、SetTimeoutの設定を無効にしたいのですが、どうすればよいでしょうか? 現在のスクリプトは以下のようになっています。 onClipEvent (load) { var id = setTimeout(go, 30000); stop(); function go() { clearTimeout(id); gotoAndPlay("シーン 3", "timeover"); } } 色々検索してみましたがわかりません・・・ どなたか分かる方がいらっしゃればご教授お願いします>_<

  • setTimeoutでループしたいのですが…………

    下記コード例(jQuery)で、「hoge1」「hoge2」に対する処理をずっと続けたいのですが、どうすればよいでしょうか? ・再帰処理? ・それはどう書けば良いでしょうか? $(function(){  $(window).load(function(){   setTimeout(function(){    $('#hoge1').animate({略},150,'linear',function(){     $('#hoge2').animate({略},150,'linear',function(){     });    });   },1000);  }); });

  • setTimeout()がうまくいきません

    以前、時計を一秒一秒、新しい絵を読み込んで バー表示型の時計を作ろうとしていた者ですが なんとか、1つの画像を連続表示させて 一本のバーにしていくスクリプトを 下記のように作りました そうしたところ、手動で更新をすると、うまく動作するのですが 自動で更新していこうと思いsetTimeout()を入れたのですが うまく動作してくれません。どのようにしたらよいのでしょうか <html> <head> <script language="JavaScript1.1"> <!-- function timesec() { var now = new Date() var s = now.getSeconds() var x = 60-s for(gj=0;gj<x;gj++) { var no = gj+1*x document.write("<img src='sec_1.gif' NAME='Name"+no+"'>") } } //--> </script> </head> <body> <script language="JavaScript1.1"> <!-- timesec() ----> </script> </body> </html>

  • JavaScript

    下記のプログラム(ボタン早押しゲーム)に以下のようなプログラムを入れたいのですが、どうすれば良いでしょうか? ・正しい順番にボタンが押されていれば毎回シャッフル(押されたボタンが色が変わり押せなくする。) 間違いならアラートで違うとメッセージを出す。 <script type="text/javascript"> // 初期化処理 var suji = "(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)"; var pushed = ""; // 押されたボタン管理 var startTime; // ゲーム開始時間を管理 var labelArray = suji.split(""); // 数字を一文字ずつ分割 $("startButton").onclick = start; nextGame(); // スタートボタンを表示する // 開始準備 function nextGame() { $("buttons").innerHTML = ""; $("startButton").style.visibility = "visible"; } // ゲーム開始 function start() { $("startButton").style.visibility = "hidden"; // 配列に数字を代入して順番をシャッフル arrayShuffle(labelArray); // ボタンを作る for (var i = 0; i < labelArray.length; i++) { var b = document.createElement("button"); b.innerHTML = labelArray[i]; b.onclick = button_clickHandler; $("buttons").appendChild(b); } startTime = (new Date()).getTime(); } // ボタンが押された時の処理 function button_clickHandler(e) { var ch = e.target.innerHTML; // 押されたボタンの文字 var tmp = pushed + ch; // 順番が正しいかどうか判定する if (suji.substr(0, tmp.length) != tmp) { alert("違います。次は、" + suji.substr(pushed.length,1)); return; } e.target.disabled = true; e.target.style.backgroundColor = "#202020"; pushed = tmp; if (pushed == suji) { var now = new Date().getTime(); var tm = Math.floor((now - startTime) / 1000); alert("おめでとうございます。\n" + tm + "秒でクリア"); nextGame(); } } // 配列をシャッフルする function arrayShuffle(bs) { for (var i = 0; i < bs.length; i++) { var r = Math.floor(Math.random()*bs.length); var tmp = bs[i]; bs[i] = bs[r]; bs[r] = tmp; } } function $(id) { return document.getElementById(id); } </script>

このQ&Aのポイント
  • 彼が飲んで欲しいけど、味が苦くて飲ませられない
  • 彼は諦めずにしつこく頼んでくる
  • 私は自信を失ってしまい、どうすればいいか分からない
回答を見る

専門家に質問してみよう