• 締切済み

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>

  • mqm
  • お礼率42% (581/1355)

みんなの回答

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.3

初級者のうちは実装のバグよりもまず、自らの認識違いを疑って下さい。

  • kawais070
  • ベストアンサー率52% (2242/4282)
回答No.2

> setTimeout の引用する関数の中に > 変数名を入れることができないという問題が > どこかのバグであるかどうか バグじゃないですよ。 setTimeout( "alert(stringQ)", 2000); と書いたときの、"" の中の処理は、グローバルスコープで実行されるのです。なので、stringQというローカル変数は、無理なわけで。 以下のように、stringQもグローバル変数にしてしまえばOKですね。 <script> var stringQ = 'Hello'; function TestQuote() { setTimeout( "alert(stringQ)", 2000) ; } </script> <button onclick="TestQuote()" > Timer 2 </button>

mqm
質問者

お礼

とても参考になりました。 これからもよろしくご指導をお願いいたします。

  • kawais070
  • ベストアンサー率52% (2242/4282)
回答No.1

<script> function TestQuote() { var stringQ = 'Hello'; setTimeout( function () { alert(stringQ) }, 2000) ; } </script> <button onclick="TestQuote()" > Timer 2 </button> という感じでどう?

mqm
質問者

補足

ご回答ありがとうございました。 質問をさせていただいた本来の目的は、setTimeout の引用する関数の中に 変数名を入れることができないという問題が どこかのバグであるかどうかを専門の方にお聞きしたかったことです。 よろしくお願いいたします。

関連するQ&A

  • 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();">

  • setTimeoutでelementを渡す方法

    setTimeoutの引数にdocument.getElementByIdの情報を格納して 他の関数に渡すことはできないのでしょうか? 下記は自分で調べた内容ですが、aaa()で変数mにdocument.getElementByIdを格納して setTimeoutの引数にその変数を指定してbbb()に渡しましたが使うことができませんでした。 [object HTMLDivElement]は渡っているようですが、tagNameでDIVが表示されません。 ccc()のように普通に渡した場合はちゃんと使えました。 データはちゃんと送られているのに、setTimeoutではなぜtagNameなどで表示されないのでしょうか。 <html lang="ja"> <head> <title>サンプル</title> <script> function aaa() { var m = document.getElementById("xxx"); alert(m); //[object HTMLDivElement] alert(m.tagName); //DIV var p = 777; setTimeout("bbb('"+m+"',"+p+")",1000); ccc(m,p); } function bbb(m,p){ alert(m); //[object HTMLDivElement] alert(m.tagName); //undefined alert(p); //777 } function ccc(m,p){ alert(m); //[object HTMLDivElement] alert(m.tagName); //DIV alert(p); //777 } </script> </head> <body onload="aaa()"> <div id="xxx">サンプル</div> </body> </html>

  • setTimeout関数の使用方法について

    はじめまして。 質問があります。 以下のコードを実行すると、一定時間おきに文字の表示が変化する ように動いてくれません。何が問題なのかがまったく見当がつき ません。どなたかご指摘をお願いします。 ---------------------------------------------------------------- <html> <head> <title>setTimeout()関数の使用例</title> </head> <body onLoad="timer=setTimeout('changeChar()',500)"> <script type="text/javascript"> <!-- var str = "abcdefghijklmnopqrstuvwxyz0123456789"; var cnt = 0; function changeChar() { clearTimeout(timer); ch = str.charAt(cnt++); document.write(ch); if(str.length > cnt) { timer = setTimeout("changeChar()",500); } } //--> </script> </body> </html> ----------------------------------------------------------------

  • JavaScriptのsetTimeoutについて

    setTimeoutのタイマー処理の仕様を調べています。 var func = function () { alert(1); }; setTimeout(func, 1000); alert(2); このコードを実行した場合、alert(2)→alert(1)の順で処理されるのは当然ですが、 alert(2)を開いたまま1秒以上待ち、そこでOKボタンを押すとどうなるか、という問題です。 Firefoxの実装については下記ページで分かりました。 http://takoyakim.tumblr.com/post/10875885/firefox-settimeout 先ほどのコードの1000ミリ秒の経過処理は、タイマースレッドという専用スレッドで扱うため、 alert(2)で1000ミリ秒以上止めた後にOKボタンを押すと、即座にalert(1)が開きます。 しかしIEの場合はそうではなく、alert(2)を閉じてから約1000ミリ秒後にalert(1)が開きました。 alert(2)を開いたままどれだけ待機しても変わりません。 ChromeやSafariもIEと同じようです。 ですがこの結果は、次のコードの実行結果と矛盾してしまいました。 var heavyFunc = function () { for(var i = 0; i < 100000; i++) new Date(); } var startTime = +new Date(); var callCount = 0; var testFunc = function (x) { heavyFunc(); // (1) if (++callCount < 5) setTimeout(testFunc, 100); else alert(+new Date() - startTime); //heavyFunc(); // (2) }; testFunc(); heavyFuncという重い処理を、setTimeoutの前後のどちらに置くかという実験コードです。 setTimeoutのタイマー処理がFirefoxのように別スレッドで実行されているのであれば、 先にsetTimeoutを呼び出してからheavyFuncを実行した方が速く処理が完了するだろう、という想定です。 そして結果は、FirefoxだけでなくIEとChromeでも先にsetTimeoutを呼んだ方が速い、となりました。 結局どのブラウザも専用のタイマースレッドを実装しており、 alert関数が特殊(タイマースレッドもブロックする)なだけ、ということなのでしょうか? それとも私が何か見落としているのでしょうか。

  • setTimeoutメソッドでローカル変数を渡したい

    setTimeoutメソッドでローカル変数を渡したい 表題の件につきましてご教授をお願いします。 やりたい事は 【1秒ごとにある関数(引数が必要)を走らせて一定回数後に停止する】 なのですが、setTimeoutで引数が渡せずに困っています。 (引数は固定ではないのでローカルの変数を使用したです。) あるWEBページで下記の方法で引数が渡るとありましたが、当方の環境ではエラーが発生します。 function test1(){ var the_string = "hello"; the_timeout = setTimeout("alert(" + the_string + ");",1000); } イメージとしては下記のようにIDとcntを渡し、受け取った関数で引数を処理、 その後再帰的に同一関数に引数を送る、です。 function timeA(timeIDA,cntA){ timeID = timeIDA; cnt = cntA; alert(cnt); cnt++; clearTimeout(timeID); timeID = setTimeout("timeA(timeID,cnt)",1000); } 動作環境はWIN IE5.0以上、NC4.75以上を考えています。 何か良い解決方法がありましたら、教えてください。 よろしくお願いします。 #もっと露骨にwaitに相当するメソッドがあると嬉しいのですがr(^^;

  • JavaScript setTimeout

    失礼します現在ボタンがクリックされた場合、指定秒数をカウント後console.logし、再度ボタンがクリックされた場合秒数を初期化して、再度カウントするようにしたいのですがうまくいきません、何卒ご教授お願い致します。 <td align="center"><input type="button" value=" 1 " onclick="myValue(1)" style="width:100%; height:45px;"></td> <script type="text/javascript"> function hoge(){ //console.log("piyo"); } function myValue(myData){ setTimeout(hoge(),3000); } </script>

  • スロットが変な動きをします

    JavaScriptで子供用にPCで遊べるようにスロットを作りました。 ここで疑問なのですが、最初にスタートとストップボタンを画像分だけ作りましたが、 スタートを同時にしてストップだけを個別にするためにスタートボタンを1個にしたら 変な動きになりました。 色々とやってみましたが以外に苦心しています。誰か宜しくお願いします。 スタートを3個にすれば簡単なことは十分わかってはいるのですが。 ________________________________________ <html><head><title></title> <script type="text/javascript"> var picture = new Array(3); picture[1] = new Image(); picture[2] = new Image(); picture[3] = new Image(); picture[1].src = "img/data1.jpg"; picture[2].src = "img/data2.jpg"; picture[3].src = "img/data3.jpg"; function autoChange() { function autoChange1(); function autoChange2(); function autoChange3(); } function autoChange1() { var kaiten1 = Math.round(9*Math.random()); document.initial1.src = picture[kaiten1].src; timer1 = setTimeout("autoChange1()", 100); } function autoChange2() var kaiten2 = Math.round(9*Math.random()); document.initial2.src = picture[kaiten2].src; timer2 = setTimeout("autoChange2()", 100); } function autoChange3() { var kaiten3 = Math.round(9*Math.random()); document.initial3.src = picture[kaiten3].src; timer3 = setTimeout("autoChange3()", 100); } function stop1(){ clearTimeout(timer1); } function stop2() { clearTimeout(timer2); } function stop3() { clearTimeout(timer3); } </script> </head> <form> <input type="button" value="START" onclick="autoChange()"> <img src="img/data1.jpg" name="initial1"> <img src="img/data1.jpg" name="initial2"> <img src="img/data1.jpg" name="initial3"> <br><br> <input type="button" value="STOP" onclick="stop1()"> <input type="button" value="STOP" onclick="stop2()"> <input type="button" value="STOP" onclick="stop3()"> </form> </body></html>

  • 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>

  • SetTimeoutの無効化について

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

  • 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> ***********************************