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

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

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

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

JavaScript

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

jQuery

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

Laravel 5

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

Q&A

2回答

2601閲覧

jqueryで配列から特定の要素を除いてunwrapしたい

gobindar

総合スコア51

PHP

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

JavaScript

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

jQuery

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

Laravel 5

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

0グッド

0クリップ

投稿2019/09/07 06:49

編集2019/09/07 06:50

お世話になっております。
当方Laravel5.5にてWebSiteを構築しております、
環境はWindows、ブラウザはIEです。

背景

あるセレクトボックスの内容に基づいて、
別のセレクトボックスのoption要素を表示・非表示させる仕組みを作っています。
(あるセレクトボックスで関東を選択すると、別のセレクトボックスで、
岩手などは他地域が非表示になり、千葉や東京が表示されるイメージです。
本件ではわかりやすいように地域のセレクトボックスと
県のセレクトボックスを扱っているものとしてご質問します)

IE Chrome Edge全てに対応したいので、
hiddenのtrue/falseではなく、<span class="wrap">
の着脱で表示非表示をコントロールしようとしています。
(もともとはhiddenでコントロールしていましたが、
只今改修を行っています)

また、当初、テンプレートを使用して上記仕組みを構築しましたので、
(初心者のため元からある部分を改変することは避けたいので)
今取得できている変数が下記の条件である、という下で実装したいです。

<取得できているもの>
・全(表示にすべき要素も非表示にすべき要素も含めた)
option要素の配列(「belongers」と名称をつけています、
中身は
0: option.~
1: option.~
2: option.~
・・・
といった形です)
・非表示にすべきoption要素の配列(「nonbelongers」と名称をつけています、
中身は上記と同じくoptionの羅列です)

なお、hiddenで表示をコントロールしていた際は、

jQuery

1belongers.prop('hidden', null) 2nonbelongers.prop('hidden', true)

で対応していました。

やりたいこと

belongersとnonbelongersを使って、下記2つを
実現するロジックを組みたいです。

①option要素の親要素にwrapがある場合かつ
表示対象(belongersとnonbelongersの差分にあたる)
である場合は、unwrapする
②option要素の親要素にwrapがない場合かつ
nonbelongersである場合は、wrapをかける

現状

下記の通りですが、1回目の地域の指定はうまくいきますが、
1回目の地域の指定の後別の地域に変更(地域のセレクトボックスをクリック)した場合、
bwrapには、親要素がwrapのものとunwrapのものがまざるため、
まとめてunwrapしてしまうと、余計な要素が削除されてしまうのが課題です。

jQuery

1const bwrap = belongers.parents().attr("class") 2const nbwrap = nonbelongers.parents().attr("class") 3 4if(bwrap == "wrap") 5{ 6belongers.unwrap(); 7} 8if(nbwrap !== "wrap") 9{ 10nonbelongers.wrap("<span class='wrap'>"); 11}

参考にしているもの

https://qiita.com/bubbles/items/cdf9e8431f67d01f7cf8
こちらを参考に実装していますが、
こちらの記載はoption要素一つ一つに対してwrapの指定をしているのに対して、
私の場合は配列に対してwrapの指定をかけるので、
2回目以降にwrapしたりunwrapする場合に、
配列の中wrapされたものとunwrapなものが混在し、
正しい処理ができません。 
(unwrapなoption要素が1つでも混じっている
状態で配列にunwrapをかけると、本来消してはいけない
親要素が消えてしまいます)

jQueryに関して全くの初心者のため、
文字による説明が多くなってしまい大変恐縮なのですが
(ブラウザの開発者ツールに出力されたoption要素などは1つの要素の中に大量に
項目があり、どこからどこまでを転載すればよいのか判断がつかず、
文字のほうがわかりやすいと判断しております)、
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

yambejp さんの指摘の通り、

<span class="wrap">の着脱で表示非表示をコントロールしよう

というのが誤りです。Qiita は個人が書くものなのでうのみにしないようにしましょう。
ここでの方針は select 要素の再生成です。
簡単な例(optionのみ入れ替え)。

jQuery

1const belongers = $('[name="pref"] option').clone(false); 2 3$(document).on('change', '[name="area"]', function(event) { 4 const options = belongers.filter('[data-area="' + this.value + '"]').clone(false); 5 $('[name="pref"]').empty().append(options); 6});

投稿2019/09/10 05:58

編集2019/09/10 07:04
x_x

総合スコア13749

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

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

0

質問の状況が把握できていませんが
セレクトボックスはdom的にoptionもしくはoptgroup以外子要素を持ていないのでは?

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 console.log(document.querySelector('#s1').innerHTML) 4}); 5</script> 6<select id="s1"> 7<option value="1">1</option> 8<span class="wrap"> 9<option value="2">2</option> 10<option value="3">3</option> 11</span> 12<option value="4">4</option> 13<optgroup label="test"> 14<option value="5">5</option> 15<option value="6">6</option> 16</optgroup> 17<option value="7">7</option> 18</select> 19

投稿2019/09/09 02:11

編集2019/09/09 02:17
yambejp

総合スコア114769

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

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

gobindar

2019/09/09 03:16 編集

yambejp様 ご回答ありがとうございます。 申し訳ありません、当方初心者でご回答の意味が理解しきれない部分があるのですが、 セレクトボックスの子要素にwrapをもたせることで、表示される選択肢から外したいという意図があります。 動作の順序としては、 1.セレクトボックス①(地域のセレクトボックス)で地域を選択 2.セレクトボックス②(県のセレクトボックス)のoptionを表示するためのjqueryが動き、 belongersのwrapを外し、nonbelongersにwrap(<span class="wrap"> ~ </span>)をかける 3.セレクトボックス②にて、①にて選択した地域の県が表示される 上記2番ができず困っています。 最終的に出力したいセレクトボックス②のHTML文としては、 ご回答の内容を使って表すと、下記の通りです。 (この場合、belongersがoption1~7、nonbelongersが4~7にあたり、 optgroupは使っていません。) <select id="s1"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <span class="wrap"> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> </span> </select>
yambejp

2019/09/09 03:20

うまく理解してもらえてないようなので繰り返しになりますが セレクトボックスの直下にspanは"置けません" つまりその方法では「命題の目的を達成できません」ということです。 私のサンプルをコピペすればspanがブラウザによって消されていることがわかりせんか?
gobindar

2019/09/10 01:49 編集

ご返答ありがとうございます。 意味を理解できず失礼いたしました。 確かに、ご教示のサンプルで再現したところ、 出力結果からspanが消えているのですが、 質問文記載の 「参考にしているもの」の https://qiita.com/bubbles/items/cdf9e8431f67d01f7cf8 のように、jsでwrapする内容を指定して ($(this).wrap("<span class='wrap'>");として) 要素を付加すると、出力結果にspanが残ります。 一度jsで試していただけないでしょうか? --20190910.以下追記-- 下記のコードでwrapがoptionに追加できます。 <script> $(function(){ $('select#select1 option[value="1"]').wrap("<span class='wrap'>"); }); </script> <select id="select1"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <optgroup label="test"> <option value="5">5</option> <option value="6">6</option> </optgroup> <option value="7">7</option> </select>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問