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

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

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

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

jQuery

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

Q&A

解決済

2回答

9025閲覧

【jQuery】cloneした要素の中にあるselectに関する質問

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2016/10/18 00:43

お世話になっております。
今回、jQueryに関して質問がございます。
なお、バージョンは2.3.3です。

今回、動的にフォームを追加するため、以下のHTMLを用意しそれをcloneする方法を取っています。

html

1<table id="post-details"> 2 <tr id="post-detail" style="display: none"> 3 <td> 4 <select name="posts[post_type][]" id="posts-post-type"> 5 <option value="0">質問</option> 6 <option value="1">バグ報告</option> 7 <option value="2">その他</option> 8 </select> 9 </td> 10 <td><input type="text" name="posts[post_title][]" id="posts-post-title"></td> 11 <td><input type="text" name="posts[post_content][]" id="posts-post-content"></td> 12 </tr> 13</table>

これとは別にpost_typepost_titleを入力する欄があり、
そこの下にある「追加」を押すことでテーブルにcloneしていきます。

HTML

1<label for="post-type">分類</label> 2<select name="post_type" id="post-type"> 3 <option value="0">質問</option> 4 <option value="1">バグ報告</option> 5 <option value="2">その他</option> 6</select> 7<label for="post-title">タイトル</label> 8<input type="text" name="post_title" id="post-title"> 9<button type="button" id="btnAdd">追加</button>

JavaScript

1$(function(){ 2 $(document).on('click', '#btnAdd', function(){ 3 $('#post-detail').clone().removeAttr('id').appendTo('#post-details') 4 .find('#posts-post-type').val($('#post-type').val()) 5 .find('#posts-post-title').val($('#post-title').val()) 6 .show(); 7 }); 8});

「追加」ボタンが押されるとcloneするコードが実行されます。
cloneするとselectの値がうまく渡らないと聞いたのでcloneした後に自力で渡すようにしたのですが、
このコードだとpost_titleへは追加フォームのデータが入るのですが、
post_typeは初期値の「質問」しか入りません。

解決方法、または間違えている場所はありますでしょうか?
ご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

<tr id="post-detail" style="display: none"> ではコピーできませんでした。また、コピー元要素(#posts-post-typeとか)にidを使うのはやめておきましょう。classで十分なはずです。

JavaScript

1$(function(){ 2 $(document).on('click', '#btnAdd', function(){ 3 $('#post-detail').clone().removeAttr('id').appendTo('#post-details') 4 .find('#posts-post-type').val($('#post-type').val()) 5 .end() // add 6 .find('#posts-post-title').val($('#post-title').val()) 7 .show(); 8 }); 9}); 10```**動くサンプル:**[https://jsfiddle.net/qyp5v06h/](https://jsfiddle.net/qyp5v06h/)

投稿2016/10/18 02:04

kei344

総合スコア69364

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

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

退会済みユーザー

退会済みユーザー

2016/10/18 02:17

.end()を追加することでうまくいきました! また、show()の位置が悪かったらしく、.appendTo()の直後に持ってくると表示されるようになりました。 フォーム要素のIDをClassにしても無事動きました。 ご回答ありがとうございました。
guest

0

テーブルをコピーしまくるということが前提でしたら、識別はIDではなくクラスのほうが適当かと思います(同じIDはHTML中に1つしか存在できません)。

$('#post-type').val()のように書くと、最初の1個(だったかな?)の値が取れてしまい、コピーしたものから取ることには必ずしもなりません。

投稿2016/10/18 01:52

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2016/10/18 02:15

id="post-type"は追加フォームの1つしか存在しないのでそこは大丈夫(なはず)です。 確かにフォーム要素のIDが重複してしまってHTML的にはよくありませんね、修正いたします。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問