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

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

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

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

HTML

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

Q&A

解決済

3回答

19708閲覧

【JavaScript】動的追加したテキストボックスは、どのようにして取得・管理するのか

nnahito

総合スコア2004

JavaScript

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

HTML

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

0グッド

1クリップ

投稿2016/04/12 15:48

質問概要

<input type="text" id="hoge">のようなテキストボックスを、
ユーザが動的追加できるようにした場合の、全てのボックスのテキストの取得方法が知りたい

質問詳細

現在趣味で開発しているサービスで、ゲームの作者を入力する欄を作りたいのですが、
作者が複数人いる場合があり、<input type="text" id="hoge">のようなテキストボックスの隣に+ボタンを設置し、
ユーザが自由に複数の作者を登録できるようにしたいと考えています。

この時、動的に作られたテキストボックスの値を取得したいのですが、

【1】一般的にどのように動的作成しているのでしょうか?
例:id="hoge"の統一(HTML文法的にアウトですよね…?)
例:name="hogeで統一…?

【2】その動的作成されたテキストボックスの値をどのように取得すればよいのでしょうか?

やってみたこと

動的追加ではありませんが…

<input type="text" id="hoge"><input type="text" id="hoge">
と、2つボックスを用意して、
$("#hoge").val();→1つ目の値しか取得できなかった


<input type="text" id="hoge" name="test"><input type="text" id="hoge" name="test">
と、name属性を同じに設定した2つボックスを用意して、
$(':text[name="test"]').val()→1つ目の値しか取得できなかった

を試してみましたがどうもできませんでした…
ご存じの方がいらっしゃいましたら、上記の【1】【2】のご教授をお願い致します。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ネーミング的にはある程度統一した方が管理しやすいかも。
例) hoge1, hoge2, ...

スマートな方法は他の方に任せて泥臭い方法を…
var f = document.form_name; //FORMタグのオブジェクトを取得
for (var i = 0; i < f.length; i++) {
var obj = f.elements[i]; //各部品のオブジェクトを取得
//型式 obj.type
//名前 obj.name
//内容 obj.value
//上記を使ってやりたいことをやる
}

投稿2016/04/12 16:32

takasima20

総合スコア7458

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

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

0

ベストアンサー

Formで動的なinputを用いる場合、特にこれら2つについて考慮する必要があるかと思います。
1.POST先のサーバーサイドプログラムで扱う場合
2.Javascript内から扱う場合
1については、質問の【1】に、2については、【2】に関連するかと。

【1】について
1については、name属性を共通でhoge[]という形式にすることで、POST先プログラムでhogeの配列として
多くの場合扱うことができますので、nameを独自にインデックスを付与する等を行うよりも、
サーバーサイドで扱いやすくなります。

【2】について
2については、validation処理等のケースが多いと思いますので、nameをそのままセレクタに用いるか、
共通のclassを指定してください。
また、val()関数をいきなり用いると、一番最初の要素の値しか返しません。name/classをセレクタで
指定した場合は配列のイメージとなりますので、一度get等で取得するか、map関数で共通処理を記述する
のが良いと思います。

投稿2016/04/12 16:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nnahito

2016/04/12 16:42

ご回答有り難うございます。 >一度get等で取得するか、map関数で共通処理を記述する ここの意味が理解できなかったのもう少し詳しい解説をお願いしてもよろしいでしょうか? jQueryでの値の取得は「.val()」ですが、今回の場合は直接利用できないので、 「get」をつかうとのことですが、「.get()」で調べるとajaxの記事しかヒットしません…… どのように使うのでしょうか?
退会済みユーザー

退会済みユーザー

2016/04/12 17:04

get関数は、セレクタで複数の要素が取得できた時に、配列の添字のように、 指定したIndexの要素を取得することができます。 (Ajaxの同じ関数名なので紛らわしいですが・・・) $(".hoge").get(0).val(); //hoge classが指定されたinputの1番目の値を取得 $(".hoge").get(1).val(); //hoge classが指定されたinputの2番目の値を取得 これを利用して、以下のような形でループを回して処理ができます。 var hoge = $(".hoge"); for (var i = 0; i < hoge.length; i++) {  //1つ1つ値を取得する  hoge.get(i).val(); } なお、これをもっと簡単にしたのがmap関数です。 map関数の引数として渡した関数を、配列の各要素で実行します。 $(".hoge").map(function() {  //1つ1つ値を取得する(実施している内容はほぼ上と一緒)  $(this).val(); }); map関数については、関数型プログラミング等で出てきたりして概念として理解しようと するとややこしいですか、こういう風に配列を一律で処理できるものだと 考えて使ってみると良いのではないかと思います。
nnahito

2016/04/12 19:48

ご返信有り難うございます。 そのような使い方ができるのを初めて知りました。 しかし、 var hoge = $(".hoge"); for (var i = 0; i < hoge.length; i++) {  //1つ1つ値を取得する  hoge.get(i).val(); } の方は、 「hoge.get(i).val() is not function」 のようなエラーが出ました…… $(".hoge").map(function() {  //1つ1つ値を取得する(実施している内容はほぼ上と一緒)  $(this).val(); }); の方は動いたので、こちらを利用させていただきます。 が、このエラーの謎が気になるので、調べてみます。 ありがとうございました。
guest

0

他にもいくつかやり方はありますが、こういう感じでいけるのでは。

HTML

1<input type=text name=aaa[]>

JavaScript

1var frm = document.form_main; 2frm.elements['aaa[]'][0].value = 'hello'; 3// ※ この例ではフォームの配列変数aaaのインデックス0に、文字列helloを格納。

【同じ名前のname属性を配列で持つ方法(フォームの配列) - JavaScript備忘録 - g:javascript】
https://javascript.g.hatena.ne.jp/py4s-tnk/20130226/1361884317

投稿2016/04/12 15:58

kei344

総合スコア69400

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問