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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

531閲覧

2つ以上のラジオボタンの条件を同時に満たすフィルタをつくりたい2

maki_oden

総合スコア10

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/09/05 14:04

実現したいこと

ふたつのラジオボタンをそれぞれ選択した際、
リストの中から「AかつB」のものが抽出される状態を目指しています。
(例:ボタン1 → 人を選択 ボタン2 → 動作を選択
抽出結果 → Aさんが歩く のようなイメージです。

この時に「AさんとBさんが歩く」という結果があり、
ボタン1でAさん、Bさんどちらを選択しても、動作が歩くであれば
「AさんとBさんが歩く」も一緒に抽出されるようにしたいです。
(ボタン1がAさん、ボタン2が歩くなら、「Aさんが歩く」と「AさんとBさんが歩く」が抽出される)

何卒よろしくお願いいたします。

前提

以下のURLの質問に、一つ条件を加えたものになります。
https://teratail.com/questions/b1s9ddtp9ij5co#reply-mewfgfz1q7tzj7

該当のソースコード

<form> <ul> <li><input type="radio" id="who-All" name="who" value="All" checked> <label for="who-All">All</label></li> <li><input type="radio" id="CharaA" name="who" value="CharaA"> <label for="CharaA">Aさん</label></li> <li><input type="radio" id="CharaB" name="who" value="CharaB"> <label for="CharaB">Bさん</label></li> </ul> <ul> <li><input type="radio" id="who-All" name="what" value="All" checked> <label for="who-All">All</label></li> <li><input type="radio" id="Walk" name="what" value="Wark"> <label for="Walk">歩く</label></li> <li><input type="radio" id="Sing" name="what" value="Sing"> <label for="Sing">歌う</label></li> </ul> <form> <ul class="filter"> <li class="target" data-who="CharaA" data-what="Walk"> <p>Aさんが歩く</p> </li> <li class="target" data-who="CharaB" data-what="Walk"> <p>Bさんが歩く</p> </li> <li class="target" data-who="CharaA" data-what="Sing"> <p>Aさんが歌う</p> </li> <li class="target" data-who="CharaB" data-what="Sing"> <p>Bさんが歌う</p> <li class="target" data-who="CharaA CharaB" data-what="Walk"> <p>AさんとBさんが歩く</p> </li> </ul>
<script> window.addEventListener('DOMContentLoaded', function(){ document.forms[0].addEventListener('change', () => { document.querySelectorAll('.target').forEach(item => { const categories = item.dataset.category.split(' '); const isDisplayed = ['who', 'what'].every( (name, i) => ['All', categories[i]].includes(document.forms[0][name].value) ); item.style.display = isDisplayed ? 'list-item' : 'none'; }) }); }); </script>

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

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

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

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

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

int32_t

2022/09/05 14:17

やりたいことは書いてありますが、質問がありません。
guest

回答1

0

ベストアンサー

こう修正ですかね:

javascript

1window.addEventListener('DOMContentLoaded', function(){ 2 3 document.forms[0].addEventListener('change', () => { 4 document.querySelectorAll('.target').forEach(item => { 5 const names = ['who', 'what']; 6 const data = names.map(name => item.dataset[name].split(' ')); 7 const isDisplayed = names.every( 8 (name, i) => ['All', ...data[i]].includes(document.forms[0][name].value) 9 ); 10 item.style.display = isDisplayed ? 'list-item' : 'none'; 11 }) 12 }); 13 14}); 15

上記のコードは、以下のように Cさん走る を追加したHTMLにも対応します。

html

1<form> 2 <ul> 3 <li><input type="radio" id="who-All" name="who" value="All" checked> 4 <label for="who-All">All</label></li> 5 <li><input type="radio" id="CharaA" name="who" value="CharaA"> 6 <label for="CharaA">Aさん</label></li> 7 <li><input type="radio" id="CharaB" name="who" value="CharaB"> 8 <label for="CharaB">Bさん</label></li> 9 <li><input type="radio" id="CharaC" name="who" value="CharaC"> 10 <label for="CharaC">Cさん</label></li> 11 </ul> 12 <ul> 13 <li><input type="radio" id="what-All" name="what" value="All" checked> 14 <label for="what-All">All</label></li> 15 <li><input type="radio" id="Walk" name="what" value="Walk"> 16 <label for="Walk">歩く</label></li> 17 <li><input type="radio" id="Sing" name="what" value="Sing"> 18 <label for="Sing">歌う</label></li> 19 <li><input type="radio" id="Run" name="what" value="Run"> 20 <label for="Run">走る</label></li> 21 </ul> 22</form> 23 24<ul class="filter"> 25 <li class="target" data-who="CharaA" data-what="Walk"> 26 <p>Aさんが歩く</p> 27 </li> 28 <li class="target" data-who="CharaB" data-what="Walk"> 29 <p>Bさんが歩く</p> 30 </li> 31 <li class="target" data-who="CharaC" data-what="Walk"> 32 <p>Cさんが歩く</p> 33 </li> 34 <li class="target" data-who="CharaA" data-what="Sing"> 35 <p>Aさんが歌う</p> 36 </li> 37 <li class="target" data-who="CharaB" data-what="Sing"> 38 <p>Bさんが歌う</p> 39 </li> 40 <li class="target" data-who="CharaC" data-what="Sing"> 41 <p>Cさんが歌う</p> 42 </li> 43 <li class="target" data-who="CharaA" data-what="Run"> 44 <p>Aさんが走る</p> 45 </li> 46 <li class="target" data-who="CharaB" data-what="Run"> 47 <p>Bさんが走る</p> 48 </li> 49 <li class="target" data-who="CharaC" data-what="Run"> 50 <p>Cさんが走る</p> 51 </li> 52 <li class="target" data-who="CharaA CharaB" data-what="Walk"> 53 <p>AさんとBさんが歩く</p> 54 </li> 55 <li class="target" data-who="CharaC" data-what="Walk Sing"> 56 <p>Cさんが歩く。そして歌う。</p> 57 </li> 58 <li class="target" data-who="CharaA CharaC" data-what="Sing Run"> 59 <p>AさんとCさんが歌う。そして走る。</p> 60 </li> 61</ul>

備考

上記で回答したJSのコードは、現状の2個のフィルター who,what に加えて例えば when(いつ) や where(どこで) が追加されても、HTMLの構造やdata属性の設計が保たれている限りは

diff

1- const names = ['who', 'what']; 2+ const names = ['who', 'what', 'when', 'where'];

という修正だけで対応できそうです。

投稿2022/09/05 15:00

編集2022/09/05 15:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

maki_oden

2022/09/05 18:53

理想通りの動きになりました! 本当に、本当に助かりました!ありがとうございました!! 備考に記載いただいたことも、疑問を先回りしていただき、心苦しいばかりです。 幾度お礼を言ってもキリがありませんが、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問