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

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

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

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

3回答

553閲覧

checkboxでの表示・非表示制御

byxbee

総合スコア13

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/02/07 22:39

前提・実現したいこと

複数の会社・商品を取り扱っている部署で、商品注文フォームを作っており、
checkboxとjavascriptを利用して、チェックが入っている会社の商品のみを表示する機能をつけたいと思っています。

インターネットでいろいろ検索して作ってみたのですが、エラーが発生しておりなかなかうまくいきません。

javascriptに詳しい方にご教示いただけますと幸いです。

※例では3社2商品ずつにしておりますが、実際には40社、各5~10商品ずつくらいあるため何としてもこのような絞り込み機能をつけたいと思っています。

どうぞよろしくお願いいたします。

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

ブラウザの開発者ツールでは Cannot set property 'display' of undefined と表示されてしまいます。

該当のソースコード

html

1<!-- 会社選択するチェックボックス --> 2<ul class="company"> 3 <li><label><input class="input" type="checkbox" value="companyA" name="company" onclick="dsProduct();" ><span>会社A</span></label></li> 4 <li><label><input class="input" type="checkbox" value="companyB" name="company" onclick="dsProduct();" ><span>会社B</span></label></li> 5 <li><label><input class="input" type="checkbox" value="companyC" name="company" onclick="dsProduct();" ><span>会社C</span></label></li> 6</ul> 7 8<!-- 商品選択するチェックボックス --> 9<ul class="products"> 10 <li class="productA"><label><input class="input" type="checkbox" value="productA1" name="product"><span>A社の商品1</span></label></li> 11 <li class="productA"><label><input class="input" type="checkbox" value="productA2" name="product"><span>A社の商品2</span></label></li> 12 <li class="productB"><label><input class="input" type="checkbox" value="productB1" name="product"><span>B社の商品1</span></label></li> 13 <li class="productB"><label><input class="input" type="checkbox" value="productB2" name="product"><span>B社の商品2</span></label></li> 14 <li class="productC"><label><input class="input" type="checkbox" value="productC1" name="product"><span>C社の商品1</span></label></li> 15 <li class="productC"><label><input class="input" type="checkbox" value="productC2" name="product"><span>C社の商品2</span></label></li> 16</ul>

css

1.products li{display:none;}

css

1function dsProduct(){ 2 product = document.getElementsByName('company') 3 if(product[0].checked) { 4 document.getElementsByClassName('productA').style.display = "block"; 5 } else if(product[1].checked) { 6 document.getElementsByClassName('productB').style.display = "block"; 7 } else if(product[2].checked) { 8 document.getElementsByClassName('productC').style.display = "block"; 9 } 10 }

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

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

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

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

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

guest

回答3

0

ベストアンサー

たとえばこう

javascript

1HTMLElement.prototype.trigger=function(eventStr){ 2 if (document.createEvent) { 3 var e = document.createEvent("HTMLEvents"); 4 e.initEvent(eventStr, true, true ); 5 return this.dispatchEvent(e); 6 } else { 7 var e = document.createEventObject(); 8 return this.fireEvent("on"+eventStr, e); 9 } 10}; 11window.addEventListener('DOMContentLoaded', function(e){ 12 Array.prototype.forEach.call(document.querySelectorAll('.company input[type=checkbox][name=company]'),function(x){ 13 x.addEventListener('change',function(e){ 14 dsProduct(e.target.value,e.target.checked); 15 }); 16 x.trigger('change'); 17 }); 18}); 19function dsProduct(v,c){ 20 Array.prototype.forEach.call(document.querySelectorAll('.'+v.replace("company","product")),function(x){ 21 x.style.display=c?"":"none"; 22 }); 23}

HTML

1<ul class="company"> 2 <li><label><input class="input" type="checkbox" value="companyA" name="company" checked><span>会社A</span></label></li> 3 <li><label><input class="input" type="checkbox" value="companyB" name="company" checked><span>会社B</span></label></li> 4 <li><label><input class="input" type="checkbox" value="companyC" name="company" checked><span>会社C</span></label></li> 5</ul> 6<ul class="products"> 7 <li class="productA"><label><input class="input" type="checkbox" value="productA1" name="product"><span>A社の商品1</span></label></li> 8 <li class="productA"><label><input class="input" type="checkbox" value="productA2" name="product"><span>A社の商品2</span></label></li> 9 <li class="productB"><label><input class="input" type="checkbox" value="productB1" name="product"><span>B社の商品1</span></label></li> 10 <li class="productB"><label><input class="input" type="checkbox" value="productB2" name="product"><span>B社の商品2</span></label></li> 11 <li class="productC"><label><input class="input" type="checkbox" value="productC1" name="product"><span>C社の商品1</span></label></li> 12 <li class="productC"><label><input class="input" type="checkbox" value="productC2" name="product"><span>C社の商品2</span></label></li> 13</ul>

value=companyAとclass=productAを紐付けるのはちょっと無理があるかもしれません
できればcompanyなのかproductなのか統一したほうがよいでしょう

投稿2018/02/08 00:49

yambejp

総合スコア114777

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

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

byxbee

2018/02/08 02:25

シンプルな解決法、ありがとうございました。 お陰様で無事やりたいことが実現できました。 もし今後も問題にぶつかってしまった際にはご助言いただけますと幸いです。 宜しくお願い致します。
guest

0

JavaScript

1function dsProduct() { 2 document.getElementsByName("company").forEach(function(company) { 3 var productClass = company.value.replace("company", "product"); 4 var products = document.getElementsByClassName(productClass); 5 var displayStyle = company.checked ? "block" : "none"; 6 Array.prototype.forEach.call(products, function(product) { 7 product.style.display = displayStyle; 8 }); 9 }); 10}

投稿2018/02/08 01:03

編集2018/02/08 01:28
root_jp

総合スコア4666

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

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

byxbee

2018/02/08 02:27

ご回答いただきありがとうございました。 今回は別の方の回答を採用いたしましたが、root_jp様のご回答も後程勉強させていただきます。 もし今後も問題にぶつかってしまった際にはご助言いただけますと幸いです。 宜しくお願い致します。
guest

0

よっ
Document.getElementsByClassNameのReturnはArrayとなりますので、

一つのElementしかなかったら、[0]を追加してください。

Document.getElementsByClassName(‘ProductA’)[0].style.display = “block” Document.getElementsByClassName(‘ProductB’)[0].style.display = “block” Document.getElementsByClassName(‘ProductC’)[0].style.display = “block”

:)

投稿2018/02/08 00:03

jerome.dupuis

総合スコア172

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

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

jerome.dupuis

2018/02/08 00:51

そうですね。HTMLCollectionですね。 HTMLCollectionの最初のValueを取得したら、[0]も書けますので、Arrayを言ってしまちゃう。 コメントありがとうございました。
byxbee

2018/02/08 02:25

シンプルな解決法、ありがとうございました。 お陰様で無事やりたいことが実現できました。 もし今後も問題にぶつかってしまった際にはご助言いただけますと幸いです。 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問