画面全体に50行×50列くらいのtd(背景色がピンク)を持ったtableを配置し、それぞれのtdにマウスが乗ったらそのtdの背景色を青くして、マウスがtdの外に出たら1秒後にピンク色に戻すものを作ろうと思ってます。つまり、tdを画素に見立てた簡単なペイントに似たものを作ろうということです。
そのために以下のjavascriptを書きました。
window.onload = function(){
td = document.getElementsByTagName("td");
for(i=0;i<td.length;i++){
td[i].onmouseover = ChCo;
td[i].onmouseout = setTimeout("ClCo('"+td[i]+"')",1000);
}
function ChCo(){
this.style.backgroundColor = "blue";
}
function ClCo(hoge){
hoge.style.backgroundColor = "pink";
}
}
この場合、onmouseoverの青くするところはうまくいくのですが、onmouseoutのsetTimeoutのところがうまくいきません。どうも、setTimeoutに設定したClCoの引数がうまく渡ってないような感じなのですが、どこが間違っているのでしょうか。
No.1ベストアンサー
- 回答日時:
TDタグのコレクションをグローバル変数にして pinkに変えるメソッドとmouseoutのハンドラを分けてみてはいかがでしょう
変数tdを スクリプトブロックの冒頭で宣言しておきます
var td;
pinkに変えるメソッドをchangePinkとします
window.onloadでは
td[i].onmouseout = ClCo;
としておきます
function ClCo()
{
var n;
for ( n = 0; n < td.length; n++ ) {
// 自分自身を配列tdから探します
if ( td[n] == this ) {
window.setTimeout( "changePink(" + n + ")", 1000 );
break;
}
}
}
function changePink( n )
{
td[n].style.backgroundColor = "pink";
}
といった具合で ・・・
ありがとうございます。提案された方法でうまく動作することができました。数日間悩んでいたのですが、やっと解決できました。ありがとうございました。
No.2
- 回答日時:
setTimeoutの引数でStringとして関数を指定する場合は、実行時にそれがevalされてグローバルスコープで実行されるためだと思います。
しかし、ClCoは無名関数 (window.onloadに指定された) 内で定義されているため、グローバルスコープでは見えません。しかも質問の例だと、ClCoにはtd[i]というオブジェクトを渡しているように見えますが、実際にはtd[i]をtoStringした文字列が渡されているだけです。
試してませんが、
setTimeout(function(){ClCo(td[i])},1000);
と無名関数で書くなどすればよいかもしれません。
提案された方法では、残念ながらうまくいきませんでしたが、setTimeoutの仕組みについて理解が深まりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- HTML・CSS 【CSS】:hasで可能? imgを含むtr要素を選択したい 1 2022/11/17 14:36
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- 工学 【制御工学】単位ステップ応答の遅れ時間の求め方(令和2年度の機械設計技術者試験(制御工学)の問題) 3 2022/11/02 10:51
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- HTML・CSS 自身のHPにYouTube動画を貼り付けるのが出来なくなり困ってます 1 2022/11/11 10:44
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プルダウンで選択すると、DBの...
-
<td>の中のonClick="location" で
-
tableの任意行にfocusをあてる
-
jspでのArrayListの値の表示
-
何番目のクラスか取得するには
-
ハイパーリンクを別ウインドウ...
-
空のテーブルを表示させたい
-
PERL
-
jqueryでどうやってエスケープ?
-
onMouseOverで複数(?)のセル...
-
PC情報の調べ方教えてください。
-
テーブルセルの列での背景色の変更
-
クリックされた罫表セルの行番...
-
ウイルスバスターオンラインス...
-
至急!GetElementById でtdの...
-
jquery datatablesを使用 イン...
-
一覧から選択した行の行番号を...
-
JavaScriptで特定のtdタグにcla...
-
Jquery on click 発火しない
-
月間予定表の作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハイパーリンクを別ウインドウ...
-
マウスをブラウザの外に出した...
-
JavaScriptで特定のtdタグにcla...
-
特定<table>内の<td>の色を変える
-
一覧から選択した行の行番号を...
-
tableの任意行にfocusをあてる
-
プルダウンで選択すると、DBの...
-
至急!GetElementById でtdの...
-
【UWSC】HTML内のある部分を抽...
-
javascript クリックすると、あ...
-
jsで質問です。 displayプロパ...
-
javascriptで質問です。 displa...
-
クリックされた罫表セルの行番...
-
テーブルの変数について
-
別ページからOnclickでテーブル...
-
スクロールバーの表示位置を変...
-
JavaScriptでテーブルをクリッ...
-
Selenium.ChromeDriverの使い方...
-
Excelで作ったhtmlファイルのサ...
-
チェックボックスにチェックが...
おすすめ情報