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

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

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

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

jQuery

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

HTML

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

CSS

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

Q&A

解決済

1回答

977閲覧

セレクトボックスで選択で新規セレクトボックス追加

flyingHigh

総合スコア41

JavaScript

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

jQuery

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

HTML

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

CSS

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

0グッド

0クリップ

投稿2019/07/15 12:17

セレクトボックスで選択肢を選ぶと、
下に同じセレクトボックスと削除ボタンが表示されるところまではできています。

セレクトボックスでAを選択して新規セレクトボックスを追加します。
同じセレクトボックスで今度はBを選択すると、
セレクトボックスがさらに追加されてしまいます。
一つのセレクトボックスで選択して追加できる新規セレクトボックスは
一つにしたいのですが、
どのようにすればよろしいでしょうか。

制限を設ければよいのだろうとは思うのですが、
具体的な方法がわかりません。

また、「選択してください」を選択したときは、新規セレクトボックスを追加しないようにするため「選択してください」(name="select-default")以外を選択時のみに、
新規セレクトボックスを追加するように(!== 'select-default')としたのですが、
うまくいきません。

どのようにすればよいのか、ご教授いただけませんでしょうか。

HTML

1 <table id="t-table"> 2 <thead> 3 <tr> 4 <th>リスト選択</th> 5 <th>リスト名</th> 6 <th>追加/削除</th> 7 </tr> 8 </thead> 9 10 <tbody id="table-tbody"> 11 <tr> 12 <td> 13 <select name="rule_original" class="changeList"> 14 <option value="select-default">選択してください</option> 15 <option value="select-a">A</option> 16 <option value="select-b">B</option> 17 <option value="select-c">C</option> 18 </select> 19 </td> 20 <td>A</td> 21 <td> 22 <input value="-" type="button" class="removeList" /> 23 </td> 24 </tr> 25 </tbody> 26</table> 27 28

CSS

1#t-table { 2 width: 100%; 3 font-size: 14px; 4 border-collapse: collapse; 5} 6 7#t-table th, 8#t-table td { 9 border: 1px solid #ccc; 10 padding: 12px 8px; 11 text-align: center; 12} 13 14#t-table th { 15 background-color: #a33337; 16 color: #fff; 17} 18 19#t-table input, 20#t-table select { 21 width: 100px; 22 cursor: pointer; 23} 24 25#t-table i { 26 font-size: 18px; 27 color: #7cb342; 28} 29 30#t-table input[type='button'] { 31 background-color: #f0f0f0; 32 border: 1px solid #aaa; 33 border-radius: 2px; 34 box-shadow: 0 1px 2px #999; 35 font-size: 14px; 36} 37 38#table-tbody tr:first-child { 39 display: none; 40}

jQuery jQuery3.2.1使用

1 $(document).ready(function() { 2 // CSSで非表示にした1行目の行を複製し、その行の下に挿入 3 $('#table-tbody>tr') 4 .clone(true) 5 .insertAfter($('#table-tbody>tr')); 6 7 8//選択肢によって削除ボタンを表示 9$(function(){ 10 $('select[name="rule_original"]').change(function() { 11 if ($('select[name="rule_original"] option:selected').val() == 'select-default') 12 $('#table-tbody>tr') 13 .eq(0) 14 .clone(true) 15 .insertAfter( 16 $(this) 17 .parent() 18 .parent(), 19 ); 20 }); 21}); 22 23 24// 行を削除する 25 $(document).on('click', '.removeList', function() { 26 $(this) 27 .parent() 28 .parent() 29 .remove(); 30 }); 31}); 32

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

一つのセレクトボックスで選択して追加できる新規セレクトボックスは

一つにしたいのですが、
どのようにすればよろしいでしょうか。

行を追加する処理を行う前に、changeイベントの発生した select が、最下行に含まれるものであるかどうかを判定して、最下行にあるものでないならば、何もせず return させればよいと思います。

また、「選択してください」を選択したときは、新規セレクトボックスを追加しないようにするため「選択してください」(name="select-default")以外を選択時のみに、

新規セレクトボックスを追加するように(!== 'select-default')としたのですが、
うまくいきません。

ご質問にあるコードでは、 以下のとおり、!== ではなく == となっています。

if ($('select[name="rule_original"] option:selected').val() == 'select-default')

また、 select-default と比較すべき、 .val() で値を取得する option を取ってくるためのセレクタが正しくないです。

上記を踏まえて、以下のように修正しました。

javascript

1$(document).ready(function() { 2 // CSSで非表示にした1行目の行を複製し、その行の下に挿入 3 $('#table-tbody>tr') 4 .clone(true) 5 .insertAfter($('#table-tbody>tr')); 6 7 8 //選択肢によって削除ボタンを表示 9 $('.changeList').change(function() { 10 if ($('.changeList').index(this) !== $('.changeList').length-1) 11 return; 12 if ($('option:selected', this).val() !== 'select-default') 13 $('#table-tbody>tr') 14 .eq(0) 15 .clone(true) 16 .insertAfter( 17 $(this) 18 .parent() 19 .parent() 20 ); 21 }); 22 23 24 // 行を削除する 25 $(document).on('click', '.removeList', function() { 26 $(this) 27 .parent() 28 .parent() 29 .remove(); 30 }); 31});

動作確認のため、上記のコードは、以下の jsFiddle の修正案1のほうに上げています。

   

上記の修正案1のコードの中で、ご質問にある1点目の

一つのセレクトボックスで選択して追加できる新規セレクトボックスは

一つにしたいのですが、
どのようにすればよろしいでしょうか。

に対応したのが、以下の部分

javascript

1if ($('.changeList').index(this) !== $('.changeList').length-1) 2 return;

です。2点目の

また、「選択してください」を選択したときは、新規セレクトボックスを追加しないようにするため「選択してください」(name="select-default")以外を選択時のみに、

新規セレクトボックスを追加するように(!== 'select-default')としたのですが、
うまくいきません。

について修正した箇所は、行を追加するかどうか判定する if 条件

javascript

1if ($('option:selected', this).val() !== 'select-default')

の部分です。上記の修正案1では、ご質問に挙げられている2点のほか、以下の修正もしています。

  • 選択されたときに行を追加する処理を囲んでいた、不要な$(・・・); を削除
  • セレクタ select[name="rule_original"] だと長いので、 .changeList で置き換え

さらに、もう少し見通しよくするならば、 selectでchange が発生したときに、行を追加する条件は

  • そのchange の発生したselectが表の最下行のものであって、かつ、選択された値が select-default ではないこと

なので、この条件を満たすかどうかの判定をひとまとめに関数にして、条件を手短かに書ける if が一つあれば済むようにします。以下では、この判定のための関数をJQuery のプラグインとして書いた例です。

javascript

1 $.fn.canAddRow = function() { 2 return ( 3 $('.changeList').index(this) === $('.changeList').length - 1 && 4 $('option:selected', this).val() !== 'select-default' 5 ); 6 };

以下の修正案2は上記の canAddRow を使って、行を追加できるselect がどうかを判定する部分を整理したものです。

以上、参考になれば幸いです。

投稿2019/07/15 13:42

編集2019/07/15 14:46
jun68ykt

総合スコア9058

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

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

flyingHigh

2019/07/24 01:18

非常にわかりやすいご説明ありがとうございます。 一部説明した内容に沿っておらず失礼しました。 canAddRowのプラグイン作成あたりは、よくわかっていないので 掘り下げて学びたいと思いました。
jun68ykt

2019/07/24 01:36

どういたしまして。解決されたようでよかったです ???? プラグインを作れるようになると、よく使う処理をひとまとめにしておけるので便利です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問