
javascript初心者ですが、練習のために神経衰弱を作っています。
簡単な骨組みはでき、要素を加えている最中なのですが、今足そうと思っている要素の書き方がわかりません。
足そうと思っているのは、
「全てカードをそろえたあと、順番にカードをひっくり返して、元に戻す」
という要素です。
setTimeoutを使って0.5秒ごとにカードを返すというコードを書いているつもりなのですが、うまくいきません。どうすればいいのでしょうか。
/-------------------------------------------------------------------------/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<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; //1枚目
var card_first; //altの数
var card_second; //altの数
var click_first; //開けた場所1
var click_second; //開けた場所2
var fullOpen = 0; //ワンペアで1追加 4でクリア
function conce(aaa){ //クリックで無地に数字を表示
var imgId = document.getElementById(aaa);//クリックしたimgのid
switch(card_c){
case 0: imgId.src = imgId.alt+".jpg";
card_c++;
card_first = imgId.alt;
click_first=aaa;
break;
case 1: imgId.src = imgId.alt+".jpg";
card_second = imgId.alt;
click_second=aaa;
card_c++;
if(card_first==card_second){//揃ったら
card_c=0;
fullOpen++;
}else{//揃わなかったら
function bunki(){
document.getElementById(click_first).src="none.jpg";
document.getElementById(click_second).src="none.jpg";
card_c=0;//setTimeoutのあとだと待つ必要があるためココ
}
setTimeout(bunki,500);//0.5秒後閉じる
}
break;
default:
break;
}//switch
//全部そろえた時のアクション
if(fullOpen==4){
alert("complete!");
//0.5秒ごとに裏返す 8回繰り返す
for(var j=0;j<8;j++){
function resetAll(){
var i = 0;
if(i<8){
document.getElementById('c_'+(i+1)).src="none.jpg";
i++;
}
}//resetAll
setTimeout(resetAll,500);
}//for
fullOpen=0;
}//if(fullOpen==4)
}//function conce(aaa)
</script>
</body>
</html>
/-------------------------------------------------------------------------------/
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
No.1 ですが、例示内容が少々分かりづらい内容だったので修正します。
// 最初のアニメの番号
var index = 0;
(function(){
// index番目のアニメ
処理(index);
// 次のアニメの番号に更新
index = index + 1;
// 次のアニメの番号が条件を満たすなら、Nミリ秒後に再実行
if(条件(index)) {
window.setTimeout(arguments.callee, N);
}
})();
お返事ありがとうございます。
丁寧にご説明いただきありがとうございます。
どうやらindex++;が抜けいていたらしく、ちゃんと繰り返していなかったようです。
お手数をおかけしました。
ありがとうございました。
No.2
- 回答日時:
よこからですが・・・
No1の補足を斜めに見ただけなので、ちゃんと確認していませんが、
indexをインクリメントしていないので、index=0のまま0.5秒おきにずっと繰り返しているのではないでしょうか?
お返事ありがとうございます。
おっしゃるとおりでした。
index++;を追加したらうまくいってくれました。
ありがとうございます。
No.1
- 回答日時:
一定間隔のアニメをやる際に、私が常用するパターンです。
var index = 0;
(function(){
処理(index++);
if (条件(index)) window.setTimeout(arguments.callee, N);
})();
少々ややこしいので解説すると、
1. 使い捨ての関数を作って即実行
2. 関数の最後で、条件に合うなら自分自身をN秒後に再実行
3. 条件に合うかぎり、再実行を繰り返す。
4. 条件に合わなくなったら今後は実行されない。関数も(たぶん)廃棄される。
使い捨ての関数には名前がないので arguments.callee を使って自分自身を取得しています。
この回答への補足
お返事ありがとうございます。
すいません、まだ解決出来ていないのでよかったらお返事いただけるとうれしいです。
教えていただいたコードを適応したのですが、うまく動いてくれません。
firebugで見たところエラーはないようなので、どこか間違っているとは思うのですが、どこかおかしなところはあるでしょうか。
<script type="text/javascript">
var card_c = 0; //1枚目
var card_first; //altの数
var card_second; //altの数
var click_first; //開けた場所1
var click_second; //開けた場所2
var fullOpen = 0; //ワンペアで1追加 4でクリア
function conce(aaa){ //クリックで無地に数字を表示
var imgId = document.getElementById(aaa);//クリックしたimgのid
//imgがnone.jpg以外なら操作しない。
switch(card_c){
case 0: imgId.src = imgId.alt+".jpg";
card_c++;
card_first = imgId.alt;
click_first=aaa;
break;
case 1: imgId.src = imgId.alt+".jpg";
card_second = imgId.alt;
click_second=aaa;
card_c++;
if(card_first==card_second){//揃ったら
card_c=0;
fullOpen++;
}else{//揃わなかったら
function bunki(){
document.getElementById(click_first).src="none.jpg";
document.getElementById(click_second).src="none.jpg";
card_c=0;//setTimeoutのあとだと待つ必要があるためココ
}
setTimeout(bunki,500);//0.5秒後閉じる
}
break;
default:
break;
}//switch
//全部そろえた時のアクション
if(fullOpen==4){
alert("complete!");
var index = 0;
(function(){
document.getElementById('c_'+(index+1)).src="none.jpg";
if(index<9)window.setTimeout(arguments.callee,500);
})();
fullOpen=0;
}//if(fullOpen==4)
}//function conce(aaa)
</script>
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- HTML・CSS テキストを画面の真ん中に配置したいです。 2 2022/11/25 16:11
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dreamweaver上とデバイスプレビ...
-
複数の要素へ appendchild でき...
-
Slick.jsのオプションrtlについて
-
html5に変えるとスライドショー...
-
jqueryのプラグインslickの画像...
-
MAX関数を使ってからLEFT JOIN...
-
フォームに入力された値により...
-
javascriptテキストBOX色を元に...
-
jQueryで同じクラス名のものを...
-
指定したパスが現URLに含まれて...
-
自働生成される<div>タグに連番...
-
createElementで作成した要素を...
-
javascriptでフォーカスを当て...
-
外部javascriptの重複を防ぐには
-
JSPでの画像ファイル表示
-
seleniumbasic chrome操作について
-
jQuery bxSlider 画像に変更
-
クリックすると下に説明文が出...
-
IplImageをPictureBoxへ表示が...
-
jspでcssが読み込めない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Slick.jsのオプションrtlについて
-
[jQuery]bxSlider 一番最後と...
-
【jQuery】2分割レイアウトで、...
-
CSSでマウスオーバーした画像を...
-
数ある中からランダムで抽出し...
-
複数のランダム表示について
-
上下の余白について
-
同じjqueryを2つ並べて動かし...
-
ロールオーバーを含む複数の動...
-
bxSliderのランダム表示について
-
jcarouselliteについてです。
-
SimplyScrollについて
-
楽天APIのデータをjqueryのgetJ...
-
横並びの画像を3枚時間差でフェ...
-
ローカルでは問題なく動くがサ...
-
html内でのマウスオーバー時に...
-
画像をフェードアウト&フェー...
-
Javascriptを使用したスライド...
-
javascript cssの値を取得、変更
-
jQueryスライドショーについて
おすすめ情報