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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

312閲覧

特定のクラスを持つselect option を全て非表示にしたい

gobindar

総合スコア51

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/03/25 06:31

編集2019/03/25 06:39

お世話になっております。
当方Laravel5.5にてWebSiteを構築しております、
環境はmac OS Mojave10.14.2
ブラウザはGoogle Chrome バージョン: 71.0.3578.98になります。

質問内容

下記のエラーが出現して困っています。
(特定のクラスを全てvisibleもしくはhiddenにしたいです)
どこが誤っていますでしょうか?

尚、エラーではクラス「visible_check」に関してエラーが出ていて、
このクラスはviewには1つしかありませんが、
この後

javascript

1 document.getElementsByClassName("."+(i+1)"_"+old[i-1]).style.visibility ="visible";

の部分で、viewに複数箇所あるクラスに対してvisibleを設定しようと考えています。
(ループしている理由は、最下部背景の通り、階層のold値からvisible/hiddenを設定したいからです)
なので、タイトルは「特定のクラスを持つselect option を全て非表示にしたい」としております。

エラー内容

Uncaught TypeError: Cannot set property 'visibility' of undefined

javascript

1if(old){ 2 var old_count_hierarchy = old.length; 3 for( var i=1; i<=old_count_hierarchy; i++){ 4 5 //エラー箇所 6 document.getElementsByClassName('.visible_check').style.visibility ="hidden"; 7 8 document.getElementsByClassName("."+(i+1)"_"+old[i-1]).style.visibility ="visible"; 9 document.getElementById('hierarchy_'+i+'_block').style.display ="block"; 10 11 } 12 ;} 13 14;}

view

html

1 <select name='category_path[]' class='list {{$filterSelect}}' {{$target}} id={{$hierarchy}} {{$empty}}> 2 @foreach($items->category_hierarchized[$key1] as $key2 => $val2) 3 @if(old('category_path') === null) 4 <?php $selected = ""; ?> 5 @else` 6 //old値に基づいてoptionにselectedをつける 7 @if(array_search($items->category_hierarchized[$key1][$key2]['category_id'],old('category_path')) !== false) 8 <?php $selected = "selected"; ?> 9 @else 10 <?php $selected = ""; ?> 11 @endif 12 @endif 13 14 15//hidden・visibleの制御をかけたい箇所 16 <option class="visible_check {{$key1}}_{{$val2['data-belongsto']}}" value="{{$items->category_hierarchized[$key1][$key2]['category_id']}}" 17 data-reference="{{$items->category_hierarchized[$key1][$key2]['category_id']}}" 18 data-belongsto="{{$val2['data-belongsto']}}" 19 onclick="visible_handling({{$key1}},{{$items->category_hierarchized[$key1][$key2]['category_id']}})" {{$disabled}} {{$selected}}> 20 21 22 {{$items->category_hierarchized[$key1][$key2]['category_name']}} 23 </option> 24 @endforeach 25 </select> 26 27

以下、本件の背景です。

実装しているもの

・今実装している画面には全選択肢が全て見えているセレクトボックスが5つあります。
・セレクトボックスはcascadingで、第一階層のセレクトボックスを選択すると、
それに合わせて第二階層のセレクトボックスとその内容が出現し、選択できるというようになっています。
・各セレクトボックスはview側でforeachを回して全て選択肢やセレクトボックスを用意しています。

<セレクトボックスの出現制御>
javascriptによるdisplay制御で、見える見えないの制御をしています。
(例えば、第一階層までしか選択していない時は、display制御で第三階層を見せていない
だけで、view側にはある)

<選択肢の出現制御>
・セレクトボックスの選択肢(option)のvalueには一意の番号が振ってあります
・各セレクトボックスの選択肢(option)は、親の番号を持っているので、
最初の階層で選択された選択肢の番号に応じて、次の階層で選択肢を変更します

<参考>
下記のデモは構築中のものと非常に似ていて、
3階層が常に見えていますが、
1階層目を選択すると2階層目が見えて…のようになる違いがあります。
(選択肢の見え方・制御は同じです)
https://www.jqueryscript.net/demo/jQuery-Plugin-To-Create-Dependent-Select-Boxes-Filter-Select/

やりたいこと

この上で、入力画面から次の画面に
行き、戻るボタンから戻ってきた際に、
optionのold値にある値から、
入力画面で入力したときと同じように画面を
再現すべく、当質問に至りました。

宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

getElementsByClassNameは配列のようなオブジェクトが返ってくるので、全部処理するならループするなどしないといけません。

【Document.getElementsByClassName() - Web API | MDN】
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName

【getElementsByClassNameとgetElementByIdの返り値の違い - Qiita】
https://qiita.com/rindarinda5/items/c26dc81fe8cd98992dc1

投稿2019/03/25 06:40

kei344

総合スコア69400

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

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

gobindar

2019/03/25 07:03

kei344様 ご回答ありがとうございます。 ご提示のQiitaを参考に下記の様にjavascriptを書き換えたのですが、 Uncaught TypeError: Cannot read property 'visibility' of undefined とエラーが発生してしまいました。 「 document.getElementsByClassName("."+(i+1)+"_"+old[i-1]).style.visibility」 では要素のスタイルは取得できないでしょうか…? var redElement = document.getElementsByClassName("."+(i+1)+"_"+old[i-1]).style.visibility; console.log(redElement[0]); for (var k = 0; k < redElement.length; k++) { redElement[k] ="visible"; }
kei344

2019/03/25 07:08 編集

あまりJavaScriptを触ったことがないのでしょうか。 入門書などをざっと読んでから作成されるほうが結局早く実装できると思いますよ。 var redElement = document.getElementsByClassName((i+1)+"_"+old[i-1]); for (var k = 0; k < redElement.length; k++) { redElement[k].style.visibility ="visible"; } // (追記:クラスセレクタが付いていた物を削除)
gobindar

2019/03/26 12:02

ご返信ありがとうございます。 Laravelは数ヶ月触りましたが、 jsはほぼノータッチ状態からこの状態になっており、 時間の関係でサンプルを組み合わせて走り抜けたい事情があります。 ご教示ありがとうございます。 ご指摘の方法でエラーは解消いたしました。 ありがとうございます。
guest

0

単純なCSSなら

CSS

1<style> 2.old{display:none} 3</style> 4<form> 5<select> 6<option value="">---</option> 7<option value="1" class="old">1</option> 8<option value="2">2</option> 9<option value="3" class="old">3</option> 10<option value="4">4</option> 11<option value="5" class="old">5</option> 12</select> 13</form>

chromeならこれで十分
ただしIEなどdisplayで調整ができないブラウザがあるので
対応したいならサーバーサイドもしくはjsでoptionを削ってしまってください

投稿2019/03/25 06:52

yambejp

総合スコア114779

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

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

gobindar

2019/03/25 07:08 編集

yambejp様、 ご回答ありがとうございます。 背景の方に記載させて頂きましたが、 階層をループさせて表示しており、 選択したoptionをoldで取得して、 oldに入っているoption以外を非表示としたいので、 javascriptで動的に処理必要があります。 >IEなどdisplayで調整ができないブラウザがある こちら大変参考になりました、ありがとうございます。 optionを削るというのは、具体的にどのような記述になりますでしょうか…? 只今調べましたが、 viewには全ての選択肢を保持するという前提では実装が難しそうです。
yambejp

2019/03/25 07:17 編集

jsで処理するなら命名規則に合致するclassを探してdisplay:noneにするか 削除するかですね
gobindar

2019/03/26 12:01

ご返信ありがとうございます。 display:noneで実装いたしました。 IEでも使用想定がありますので、 以降気をつけてまいります。
guest

0

これを参考にできますか?
value値を見て判断します

javascript

1<!DOCTYPE html> 2<meta charset="utf-8"> 3<title>?</title> 4 5<body> 6 7<select name="hoge1"></select> 8<select name="hoge2"></select> 9<select name="hoge3"></select> 10<select name="hoge4"></select> 11<select name="hoge5"></select> 12 13 14<script> 15//まずは初期設定 16const 17 A = (a, b)=> a.concat (C[0].map (a => b + '-' + a)), 18 B = (a, b)=> ['', ...b].forEach (c => a.appendChild (new Option (c,c))), 19 C = [[1,2,3,4,5]], 20 D = [...document.querySelectorAll ('select[name^="hoge"]')]; 21 22C[1]=C[0].reduce (A, []); 23C[2]=C[1].reduce (A, []); 24C[3]=C[2].reduce (A, []); 25C[4]=C[3].reduce (A, []); 26 27D.forEach ((e,i)=> B(e,C[i])); 28 29 30//本題はここから 31 32D.forEach (a => a.addEventListener ('change', ({target: e})=> { 33 let n = D.indexOf (e); 34 if (-1 < n) 35 D.slice (n + 1).forEach (s => { 36 let op = [...s.options]; 37 op.forEach ((a,i) => a.style.display = (a.value.indexOf (e.value) == 0 || i == 0) ? 'block': 'none'); 38 s.selectedIndex = 0; 39 }); 40 41}, false)); 42 43</script> 44

投稿2019/03/25 09:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問