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

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

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

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

Q&A

解決済

2回答

945閲覧

選択肢が4つあるうちの一つを選択するとそれ以外の選択肢を押せなくする

skilton

総合スコア9

JavaScript

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

0グッド

0クリップ

投稿2020/04/19 06:23

お疲れ様です。
お手数をおかけいたしますが宜しければご教授いただければと思います。
また、質問文の中で何かありましたら直ぐに返答いたします。

[疑問点]
コマンド['攻撃', '魔法', '道具', 'にげる']の一つを押したときに他のコマンドのイベントを無効にしたいと思っております。
その際、[やってみたこと]でも記載するのですが、特定のボタンを押したときにそれ以外の要素を一つ一つとって来てpointerEventで設定をするということも検討したのですが文が長くなってしまい可読性?が悪くなってしまうので、特定のボタンを押されたときにそれ以外の要素をまとめて設定できる処理がないか教えていただければと思います。

[やってみたこと]
例えば、攻撃を押されたときにそれ以外の要素を一つ一つ取って来てpointerEventで設定するということを検討したのですが文が長くなってしまう

javascript

1 User.prototype.clickCommand = function( checkCommand ) { 2 console.log( checkCommand ); 3 if ( checkCommand == 1 ) { 4 console.log('攻撃!'); 5 document.querySelector('.magic').style.pointerEvent = 'none'; 6 } else if ( checkCommand == 2 ) { 7 console.log('魔法!'); 8 } else if ( checkCommand == 3 ) { 9 console.log('道具'); 10 } else if ( checkCommand == 4 ) { 11 console.log('逃げる!'); 12 } 13 } 14

html

1<div class="command-container-right"> 2 <p class="command attack" data-index-id="1">こうげき</p> 3 <p class="command magic" data-index-id="2">まほう</p> 4 <p class="command tool" data-index-id="3">どうぐ</p> 5 <p class="command run" data-index-id="4">にげる</p> 6 </div>

javascript

1 2 User.prototype.clickCommand = function( checkCommand ) { 3 console.log( checkCommand ); 4 //ここのif文の処理で簡潔にかければと思います。 5 if ( checkCommand == 1 ) { 6 console.log('攻撃!'); 7 } else if ( checkCommand == 2 ) { 8 console.log('魔法!'); 9 } else if ( checkCommand == 3 ) { 10 console.log('道具'); 11 } else if ( checkCommand == 4 ) { 12 console.log('逃げる!'); 13 } 14 } 15 16TapBattleObj.command.forEach( index => { 17 index.addEventListener('click', ()=> { 18 if ( index.dataset.indexId == 1 ) { 19 let checkCommand = index.dataset.indexId; 20 console.log( '攻撃!'); 21 UserA.clickCommand( checkCommand ); 22 } else if ( index.dataset.indexId == 2 ) { 23 let checkCommand = index.dataset.indexId; 24 console.log(' 魔法 '); 25 UserA.clickCommand( checkCommand ); 26 } else if ( index.dataset.indexId == 3 ) { 27 let checkCommand = index.dataset.indexId; 28 console.log( '道具 '); 29 UserA.clickCommand( checkCommand ); 30 } else if ( index.dataset.indexId == 4 ) { 31 let checkCommand = index.dataset.indexId; 32 console.log( 'にげる'); 33 UserA.clickCommand( checkCommand ); 34 } 35 },false); 36 });

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは

ご質問の主旨としては、似たようなコードを4回書くのを避けたい、ということかなと思われましたので、一例を回答します。

要件を満たすための最小限の属性だけを持つように、HTMLを以下のように修正します。

html

1<div class="command-container-right"> 2 <p class="command" data-text="攻撃">こうげき</p> 3 <p class="command" data-text="魔法">まほう</p> 4 <p class="command" data-text="道具">どうぐ</p> 5 <p class="command" data-text="逃げる">にげる</p> 6</div>

以下のような、クリックハンドラーを作成しておきます。

javascript

1const commands = [...document.querySelectorAll(".command")]; 2 3const handleContainerClick = function({ target }) { 4 if (target.classList.contains("command")) { 5 console.log(`${target.dataset.text}!`); 6 commands.forEach(cmd => { 7 if (cmd.textContent !== target.textContent) 8 cmd.style.pointerEvents = "none"; 9 }); 10 } 11}; 12

上記を div.command-container-right に設定します。

document.querySelector('.command-container-right') .addEventListener('click', handleContainerClick, false);

以下は、上記のコードの動作確認用のサンプルです。

たとえば、最初に「どうぐ」をクリックすると、console.log に 道具! と出力され、それ以後、「どうぐ」以外をクリックしても、console.log に何も出力されないことを確認できると思います。

投稿2020/04/19 07:48

編集2020/04/19 08:14
jun68ykt

総合スコア9058

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

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

skilton

2020/04/27 05:46

お返事が遅くなってしまい申し訳ございません。 見たことのない書き方もあり大変勉強になりました!ありがとうございます
jun68ykt

2020/04/27 06:59

どういたしまして???? > 見たことのない書き方もあり大変勉強になりました! とのことでよかったです????
guest

0

siblingsを使って、クリックされた要素以外の全兄弟要素が取得できます。

console.logで表示させるテキストもHTML側のdata属性に設定しておけば、
条件分岐の必要もないかなと。

$('.command').on('click', function () { console.log($(this).data('consle')); $(this).siblings().css('pointer-events','none'); });

投稿2020/04/21 15:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問