質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

386閲覧

jQueryのクリックイベントの制御について

ysmd

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

1グッド

0クリップ

投稿2018/04/20 00:00

前提・実現したいこと

今jQueryで神経衰弱を作っていて、カードを選択してカードの番号が一致しなければカードを「?」にするのですが、
そのときに1秒間他のカードをクリックできないようにしたいです。
アドバイスのほどよろしくお願いします。

発生している問題・エラーメッセージ

今はカードが一致せずに「?」になる時、間髪入れずに次のカードが選択できます。

該当のソースコード

<!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="format-detection" content="telephone=no"> <title></title> <link rel="stylesheet" href="css/reset.css"> <link rel="stylesheet" href="css/base.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <ul class="lists clearfix"></ul> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript"> //カードを開く function open($card){ $card.css('pointer-events','none').text($card.data('num')); } // カードを閉じる var returnSec = 500; function close($card){ $card.css('pointer-events','').text('?'); } // カードを比較 function compare($card){ var card1 = $('.first'); var card2 = $card; var num = 'num'; var firstNum = card1.data(num); var secondNum = card2.data(num); var unopened = 'unopened'; var first = 'first'; var returnSec = 1000; if(card1.length == 0){ $card.addClass(first); } else { card1.removeClass(first); if(firstNum == secondNum){ card1.removeClass(unopened); card2.removeClass(unopened); if($('.' + unopened).length == 0){ alert('Game Over'); } } else {    close(card1); close(card2); //今はここにクリック制御のコードを書いています $('.lists li').css('pointer-events','none'); setTimeout(function(){ $('.lists li').css('pointer-events',''); },returnSec); } } } $(function(){ var cardNum = []; var totalCard = 16; for (var i = 1; i <= totalCard/2; i++){ cardNum.push(i,i); } cardNum.sort(function(){ return Math.random() - Math.random(); }).map(function(num){ return "<li class='unopened' data-num='" + num + "'>?</li>"; }).forEach(function(element){ $(".lists").append(element); }); $('.lists li').click(function(){ var $openedCard = $(this); open($openedCard); setTimeout(function(){ compare($openedCard); }, returnSec); }); }); </script> </body> </html>
Nippun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/04/20 00:17 編集

試してなくて斜め読みなので回答には書きませんが、var returnSec = 1000; の var をはずしてみては?
sousuke

2018/04/20 00:17

「自分でこうしてみた」というものはないんですか?「1秒まつ」という仕様が確定しているのですから何かしらできると思いますが
guest

回答3

0

ベストアンサー

そんな場合はlodashのthrottleを使うと楽ですよ。
「指定msの間、指定した関数の実行を制限する」という関数を定義できます。
それをjQueryのclickイベントに仕込めば実装完了です。
https://jsfiddle.net/so87rkh/xpvt214o/165138/

あわせて_.debounceもセットで覚えておくといいでしょう。

追記:
すみません。現状のコード内容をよく読んで動きを確認すると、
ただclickイベントを抑制すればいいという単純な話ではありませんでした。
jsfiddleで修正コードを書いてみたところ、_.throttleの出番はなく、
イベント発生時の条件判定で済む内容となりました。
http://jsfiddle.net/so87rkh/xpvt214o/178234/latest/

投稿2018/04/20 00:52

編集2018/04/23 00:52
so87

総合スコア764

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2018/04/20 01:46

なんすかその便利なライブラリ。 今まで、制限系の処理は、全部手で書いてましたよ・・・。 使います。
ysmd

2018/04/21 05:00

回答ありがとうございます! こんなライブラリがあったんですね。 頂いた回答を参考に考えてみたいと思います!
guest

0

直接的な回答ではありませんが, 例えばクリックする毎に次のクリックを阻むフラグ値を用意しておいて, その内容を元にクリック時の処理の継続・中断を判定させるようにしたら如何でしょうか?

JavaScript

1"use strict"; 2{ 3 let blockClick = false; 4 document.onclick = e => { 5 if(blockClick){return;} 6 //何らかの処理 7 console.log("clicked"); 8 blockClick = true; 9 setTimeout(()=>blockClick = false, 1000); 10 } 11}

で, このような汎用の処理はライブラリ化しておきたいので, 次のようにしてみる.
(あまり検証していないので, 使い方によってはバグがあるかもしれない.)

JavaScript

1"use strict"; 2{ 3 function blockable(f){ 4 let blockClick = false; 5 return function(e){ 6 e.block = ms => (blockClick = true, setTimeout(() => blockClick = false, ms)); 7 blockClick || f.bind(this)(e); 8 }; 9 } 10 document.onclick = blockable((e) => { 11 console.log("clicked"); 12 e.block(1000);//同一のイベント処理の発生を1000ms阻む 13 }); 14}

投稿2018/04/20 00:21

編集2018/04/20 01:04
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ysmd

2018/04/21 05:06

回答ありがとうございます! 参考になります! 作業時に生かしてみます!
guest

0

理想的な解決方法ではありませんが、条件が一致しない場合は1秒間カードの上に透明のフィルターを被せてクリックできないようにする。
その他はやはりフラグ設定して制御する方法が簡単かと思います。

投稿2018/04/20 00:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ysmd

2018/04/21 05:02

回答ありがとうございます! そういう考え方は盲点でした。 フラグ設定が簡単そうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問