みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javascript setTimeout

javascript初心者ですが、練習を兼ねて神経衰弱を作っています。
setTimeoutを使って「めくったカードが違う場合、少し時間を経過させてから元に戻す」
という動作を作りたいのですが、うまくいきません。

/--------------------------------------------------------/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>神経衰弱</title>
<style type="text/css">

ul {
width: 300px;
list-style:none;
margin: 0;
padding: 0;
}

li {
float:left;
margin: 0;
padding; 0:
}

img {
vertical-align: bottom; /*上下隙間埋め*/
}

#all {
width: 300px;
margin: 0px auto 0px;
margin-top: 50px;
}

</style>
</head>
<body>

<div id="all">
<ul>
<li><img src="none.jpg" alt="3" width="100" height="100" id="c_1" onclick="conce('c_1')" /></li>
<li><img src="none.jpg" alt="1" width="100" height="100" id="c_2" onclick="conce('c_2')" /></li>
<li><img src="none.jpg" alt="4" width="100" height="100" id="c_3" onclick="conce('c_3')" /></li>
<li><img src="none.jpg" alt="4" width="100" height="100" id="c_4" onclick="conce('c_4')" /></li>
<li><img src="none_2.jpg" alt="" width="100" height="100"/></li>
<li><img src="none.jpg" alt="2" width="100" height="100" id="c_5" onclick="conce('c_5')" /></li>
<li><img src="none.jpg" alt="1" width="100" height="100" id="c_6" onclick="conce('c_6')" /></li>
<li><img src="none.jpg" alt="2" width="100" height="100" id="c_7" onclick="conce('c_7')" /></li>
<li><img src="none.jpg" alt="3" width="100" height="100" id="c_8" onclick="conce('c_8')" /></li>
</ul>
</div>

<script type="text/javascript">
var card_c = 0; //数字が表示されているimgの数
var card_first; //altの数
var card_second; //altの数
var click_first; //開けた場所1
var click_second; //開けた場所2

function conce(aaa){ //クリックで無地に数字を表示

var imgId = document.getElementById(aaa);//クリックしたimgのid

if(card_c==0){ //1枚目
imgId.src = imgId.alt+".jpg";
card_c++;
card_first = imgId.alt;
click_first=aaa;
}else{//2枚目
imgId.src = imgId.alt+".jpg";
card_second = imgId.alt;
click_second=aaa;

if(card_first==card_second){
card_c=0;
}else{
setTimeout("bunki()",500);
card_c=0;
}


function bunki(){
document.getElementById(click_first).src="none.jpg";
document.getElementById(click_second).src="none.jpg";
}

}
}
</script>
</body>
</html>
/----------------------------------------------/
どこが間違っているのでしょうか。
よろしくお願いします。

投稿日時 - 2013-11-05 15:30:35

QNo.8335171

すぐに回答ほしいです

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

bunki がグローバルスコープに存在しないため、第一引数を eval できずに失敗しています

誤: setTimeout("bunki()", 500);
正: setTimeout(bunki, 500);

このあたりのスコープに関する説明は少々敷居の高いので省略しますが、
そもそも(誤)の記法はすでに非奨励なので、
この機会に(正)の記法を覚えていただければ幸いです。
参考) https://developer.mozilla.org/ja/docs/Web/API/window.setTimeout

余談ではありますが...
二枚目をめくった後に0.5秒以内に次のカードをめくるとバグる問題が残っています。ご注意ください

投稿日時 - 2013-11-05 18:19:47

補足

お返事ありがとうございます

非推奨だったんですね。
以後使わないようにします。

修正後、fireBugで確認したのですが、
ReferenceError: bunki is not defined
setTimeout(bunki,500);
と表示され、機能してくれません。
まだどこか間違っているのでしょうか。
よろしければ、もう一度お答えいただけると幸いです。

投稿日時 - 2013-11-06 12:21:45

お礼

すいません、解決しました。
function bunki(){
document.getElementById(click_first).src="none.jpg";
document.getElementById(click_second).src="none.jpg";
}

setTimeout(bunki,500);
の前に持ってきたらちゃんと動作しました。
ありがとうございました。

投稿日時 - 2013-11-06 16:17:11

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問