JavaScriptでフォーム内配列要素の要素数を取得する方法

このQ&Aのポイント
  • JavaScriptを使って、フォーム内の配列要素の要素数を取得する方法について教えてください。
  • 具体的な例として、下記のようなフォームがあります。
  • JavaScriptを使用して、各フォームの要素数を取得し、それを制御する方法を教えてください。
回答を見る
  • ベストアンサー

JavaScriptでフォーム内配列要素の要素数

いつもお世話になっております へんな質問で申し訳ございません CMSなどを使っているとフォーム内に配列形式になった名称をよく見かけるのですが 仮に下記のような場合に JavaScript内で各フォームの各々の要素数を取得することは可能でしょうか? <form name="f"> <input type="text" name="scf[配列1][0]" value="" class="widefat"> <input type="text" name="scf[配列1][1]" value="" class="widefat"> <input type="text" name="scf[配列1][2]" value="" class="widefat"> <input type="text" name="scf[配列2][0]" value="" class="widefat"> <input type="text" name="scf[配列2][1]" value="" class="widefat"> <input type="text" name="scf[配列2][2]" value="" class="widefat"> <input type="text" name="scf[配列2][3]" value="" class="widefat"> </form> 例えばJavaScriptで var nLenA = formname(scf[配列1]).length; var nLenB = formname(scf[配列2]).length; とすると nLenAの値は3 nLenBの値は4 という具合に配列数を取得してこれらを制御したいと考えています おいそがしいところ申し訳ございませんが わかる方がいらっしゃいましたらご教授お願い致します

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

inputタグのnameに []を使っても、JavaScript上では 配列や連想配列には、なってくれないようなので フォームオブジェクトのelements["nameでつけた名前そのまま"]で 入ってくれているのを取り出すしかないようです。 ただ、form上で <input type="text" name="scf[配列1][]" value=""> <input type="text" name="scf[配列1][]" value=""> <input type="text" name="scf[配列1][]" value=""> のように、nameがまったく同じであれば  n = document.forms.f.elements["scf[配列1][]"].length で name="scf[配列1][]"が 3個あるというのは取り出せます。 しかし <input type="text" name="scf[配列1][0]" value=""> <input type="text" name="scf[配列1][1]" value=""> <input type="text" name="scf[配列1][2]" value=""> のようになっていると elements[]内では、 "scf[配列1][0]" "scf[配列1][1]" "scf[配列1][2]" のように異なる名前になっているので、 document.forms.f.elements["scf[配列1][]"].length や document.forms.f.elements["scf[配列1]"].length としても、そんなオブジェクトはないというエラーになってしまいます。 なのでこの場合、泥臭いですが n = 0; for ( i = 0; i < document.forms.f.elements.length; i++ ) { if (document.forms.f.elements[i].name.match(/scf\[配列1\]\[[0-9]+\]/)) n++; //elements[i].nameを scf[配列1][数値]の正規表現でマッチさせてカウント } って感じでカウントするしかないのでしょう。 もしくは、elements[]に入っているnameを使って配列に変換してくれる 汎用的な関数があれば、それを使うのが簡単そうですが、 ただ、formで入ってきたname値をなんでもかんでも配列に変換してしまうと この処理に前に作っておいた変数を上書きしてしまう危険もあるし 場合によっては、XSS攻撃されてしまうので慎重にしたほうがよいかもです。 他に適切な方法があるようなら私も知りたいです。

その他の回答 (1)

  • Proof4
  • ベストアンサー率78% (151/192)
回答No.2

要素をクエリセレクタを用いて取得すると簡単に実現できます。具体的には const nLenA = document.querySelectorAll('[name^="scf[配列1]"]').length; のようにします。 [name^="scf[配列1]"] がクエリセレクタで、name属性の値が scf[配列1] で前方一致する要素をすべて取得します。

関連するQ&A

  • フォームのname値を配列にしてJavaScriptでフォームのチェックをする方法

    JavaScriptでフォームの半角数字のチェックをしたいのですが、 form内容をCGI(PHP)に渡すためname値を配列にしないといけないのですが、 以下のスクリプトだとエラーが出てしまいます。 *実際はif(isNaN~)と<input~>をループで書き出しており、行数が不特定なので それぞれ別のname値を使うことができない状態です。 <script language="JavaScript"> function check() { if(isNaN(document.form1.hoge[0].value)){ alert("値は半角数字で入力してください。"); return(false); } if(isNaN(document.form1.hoge[1].value)){ alert("値は半角数字で入力してください。"); return(false); } return(true); } </script> <form method="post" action="xxx.cgi" onSubmit="return check()" name="form1"> <input type="text" name="hoge[0]"> <input type="text" name="hoge[1]"> </form> 特にCGIに渡す必要がなければ <input type="text" name="hoge"> <input type="text" name="hoge"> としてやればチェックができるのですが、どうしても次の 処理があるためname値を配列にする必要があります。 解決方法がわかる方がおられましたらご教授ください。 以上よろしくお願いいたします。

  • javascriptの計算フォームでカンマ区切り

    下記のようなjavascriptの計算フォームで計算結果に3ケタのカンマ区切りと小数点第2位までで切り捨てるようにしたいのですがどのようにすればよろしいでしょうか? 「javascript カンマ区切り」で検索したサイトをいろいろ見てみたのですが全然わかりません。 どなたかご教授お願い致します。 <head> <script language="JavaScript" type="text/JavaScript"> <!-- function Multiplication(form){ var test = form.ans.value = eval(form.num1.value)*eval(form.num2.value); return false; } --> </script> </head> <p>A×B×C=合計</p> <div> <form name="multiplication"> <input type="text" size="6" name="num1"> × <input type="text" size="6" name="num2" onBlur="Multiplication(this.form)"> = <input type="text" size="15" name="ans" class="txtbox">円(税別価格) <input type="reset" value="やり直し"> </form> </div> </body> </html>

  • HTMLのinputタグ数が変わる場合のjavascript処理

    パターンA ~HTML~ <input type='text' name='a[]'> <input type='text' name='a[]'> ~JavaScript~ var n = document.form1.elements["a"][0].value ; var n = document.form1.elements["a"][1].value ; パターンB ~HTML~ <input type='text' name='a[]'> ~JavaScript~ var n = document.form1.elements["a"][0].value ; ---(1) パターンAではエラーが出ないのですが、パターンBでは(1)のところでエラーになってしまいます。 【elements["a"][0]】の部分を【elements["a"]】とすればエラーは出ません。 どうやら、inputタグが1つしかない場合は、Javascriptでは配列として認識しないようです。 できれば、inputタグが1つの場合でも複数の場合でも、同じJavascriptコードを使いたいのですが、何か良い方法はありますか?

  • javascript フォームについて

    javascriptでフォームを作ったのですが、複数フォームの空白をチェックするにはどのようなプログラムにすればよろしいでしょうか? onsubmit="return chk1(this)でフォーム送信が押されたときにチェックを行おうと考えているのですが そのときのchk()の中身やif文の条件がわからないのです。 どのようにすれば上手くいくでしょうか? 回答よろしくお願いします。 ソースは以下のとおりです。 <script language="javascript"> function send() { document.nform.submit(); document.nform2.submit(); document.nform3.submit(); } function chk1(frm){ if(frm.elements["txt1"].value==""){ alert("解答欄に空白があります"); /* FALSEを返してフォームは送信しない */ return false; }else{ /* TRUEを返してフォーム送信 */ return true; } } </script> <form name="nform" method="POST" action="mailto:webmaster@a.com?subject=問い合せ" enctype="text/plain"> <p>問1</p> <p> (1)<input type="text" name="kaitouran11" size="20"> (2)<input type="text" name="kaitouran12" size="20"> (3)<input type="text" name="kaitouran13" size="20"> (4)<input type="text" name="kaitouran14" size="20"> </p> </form> <form name="nform2" method="POST" action="mailto:webmaster@leposystems.com?subject=問い合せ" enctype="text/plain"> <p>問2</p> <p> (1)<input type="text" name="kaitouran21" size="20"> (2)<input type="text" name="kaitouran22" size="20"> (3)<input type="text" name="kaitouran23" size="20"> (4)<input type="text" name="kaitouran24" size="20"> </p> </form> <form name="nform3" method="POST" action="mailto:webmaster@leposystems.com?subject=問い合せ" enctype="text/plain"> <p>問3</p> <p> (1)<input type="text" name="kaitouran31" size="20"> (2)<input type="text" name="kaitouran32" size="20"> (3)<input type="text" name="kaitouran33" size="20"> (4)<input type="text" name="kaitouran34" size="20"> </p> </form> <input type="button" value="送信" onClick="send()" onsubmit="return chk1(this)">

  • JavaScriptにて動的に配列を作成して、POSTで渡したい

    独学でJavaScriptの勉強をしているものです。 勉強用に作っているサイトにて、どうしてもやり方がわからないことがあるので、教えて下さい。 以下のようなフォームがあったとします。 <form name="testForm1"> <input type="hidden" name="id" value="1" /> <input type="checkbox" name="check" /> </form> このフォームは動的に複数作成され、idのvalueはフォームごとに別の値が入ります。 それで行いたいことは、複数あるtestForm1から、チェックボックスにチェックが付いているidだけを取得して、別のページにPOSTで渡したいんです。 以下のようなスクリプトを書いたのですが、思うように動作してくれませんでした。 <form action="hoge" name="testForm2" method="post"> <input type="hidden" name="id" /> </form> function func() { var idArray = new Array(); for ( count = 0; count < document.testForm1.length; count++ ) { if ( document.testForm1.check.checked == true ) { idArray.push( document.testForm.id.value ); } } document.testForm2.id.value=idArray; document.testForm2.submit(); } JavaScriptに関しては独学で必要に応じて勉強している感じで、あまり基礎がわかっておらず、もしかしたらかなり的外れな質問になってしまっているかもしれませんが、どうか宜しくお願い致します。

  • javascriptでselectボックスの<OPTION>要素数の取

    javascriptでselectボックスの<OPTION>要素数の取得する方法について疑問があります。 データが1件の場合、複数件の場合とで分けて、 <OPTION>要素数を取得する処理を記述していますが、 データが1件の場合、 document.getElementsByName("sel").length で正しい値が取得できません。 詳しくは下記のソースを参照していただきたいのですが、 (1)、(2)、(4)は、正しい値'5'ですが、 (3)だけ誤った値'1'になります。 これはなぜでしょうか? javascript初心者のため、初歩的な質問かもしれませんが、 教えていただけたら嬉しいです。 よろしくお願い致します。 -------------------------------------- <HTML> <HEAD> <SCRIPT language="JavaScript">   function getSelLen(){ var oForm = document.form1; var sObj; var sObj2; //チェックボックスの数でデータが複数件か1件か判別しています。 if(oForm.chk.length){ //データが複数件の場合 for ( var i = 0; i < oForm.chk.length; i++ ) { sObj=document.getElementsByName("sel")[i]; alert("(1) "+ sObj.length); //・・・・(1) 正 sObj2=oForm.elements["sel"][i]; alert("(2) "+ sObj2.length); //・・・・(2) 正 } }else{ //データが1件の場合 sObj=document.getElementsByName("sel"); alert("(3) "+ sObj.length); //・・・・(3) 誤 sObj2=oForm.elements["sel"]; alert("(4) "+ sObj2.length); //・・・・(4) 正 } } </SCRIPT> </HEAD> <BODY> <FORM name="form1"> <TABLE> <TR> <TD> <INPUT type="checkbox" name="chk" > </TD> <TD> <SELECT name="sel" > <OPTION value="" selected> <OPTION value="00">00 <OPTION value="01">01 <OPTION value="02">02 <OPTION value="03">03 </TD> </TR> <!-- 複数件の場合 以下のコメントアウトを解除する --> <!-- <TR> <TD> <INPUT type="checkbox" name="chk" > </TD> <TD> <SELECT name="sel" > <OPTION value="" selected> <OPTION value="00">00 <OPTION value="01">01 <OPTION value="02">02 <OPTION value="03">03 </TD> </TR> --> </TABLE> </FORM> <FORM name="form2"> <INPUT type="button" onClick="getSelLen()" value=" selectの要素数 "> </FORM> </BODY> </HTML>

  • JavaScriptが参照する要素名が配列の場合は?

    下記に示すようなリンクをクリックすると入力欄に入力されるjavascriptを作っているのですが、inputのname属性が配列になっているとうまく参照してくれません。 フォームの生成や送信内容の処理が配列だと都合がよく、なんとかできないかと悩んでいます。html側の要素名を変えずにjavascriptに参照させる方法はないでしょうか。 うまくいく場合の抜粋 function f1(VALUE){ if(!document.MyForm.str1.value){ document.MyForm.str1.value = VALUE; } } <input name="str1" type="text" /> <a href="javascript:f1('単語');">単語</a> うまくいかない場合の抜粋 function f2(VALUE){ if(!document.MyForm.str[1].value){ document.MyForm.str[1].value = VALUE; } } <input name="str[1]" type="text" /> <a href="javascript:f2('単語');">単語</a>

  • JavaScriptを使った計算フォーム

    JavaScriptを使った計算フォームで質問です。 人数をテキストボックスに入力し、そのあと項目を選ぶと計算がされるようにしたいのですが ラジオボタンが持っているvalueを取り出せません。 下記の「←------???」と書いてあるところを何とかすれば完成だと思うのですが、 どなたか教えていただけないでしょうか? <script language="JavaScript" type="text/JavaScript"> function sjLeft(source,length) { if (source.length < length) { return (""); } return source.substr(0, length); } function sjReplace(source,start,length,target) { sjlen = source.length; if ((start > sjlen) || (start < 0)) { return String(""); } return String(sjLeft(source,start ) + target + source.substr(start+length, sjlen)); } function sjInsert( source, start, target) { return sjReplace(source,start,0,target); } function fcheck(obj) { s1_2value = ??? * new Number(document.form1.n1.value); ←------??? document.form1.s1_2.value = String(s1_2value); document.form1.total.value = s1_2value; return true; } </script> <form name="form1" method="POST"> <table width="400" border="1"> <tr> <td>人数</td> <td></td> <td><input type=text name=n1 size=8 onChange="fcheck(this);">人</td> <td></td> </tr> <tr> td><input name="n2" type="radio" value="13000" onChange="fcheck(this);">食事A</td> <td>\13,000</td> <td>×人数</td> <td><input name=s1_2 type=text size=8 readonly>円</td> </tr> <tr> <td colspan="2">&nbsp;</td> <td>総計</td> <td><input type=text readonly name=total size=10>円</td> </tr> </table> </form>

  • javascript 要素取得

    htmlでチェックボックスを作り、その値をjavascriptで取得したいと思い、 下記のようなプログラムを書きました。 セレクトボックスから複数選択できるようにしたいのですが、 表示されるのは複数選んだ際に一番初めに選択したものだけです。  例) 「あああ」と「いいい」を選ぶと「あああ」のみ表示される。 しかし、これを「あああ.いいい」としたいのです。 できれば、 「あああ  いいい」 と改行できるといいです。 formの中にたくさんの項目があるため、 forのところがうまくいっていないのでしょうか? どなたかよろしくお願いします。 javascript側 function checkbox(){  var str="";  for(i=0;i<document.form1.elements.length;i++){   if(document.form1.elements[i].checked){     if(str != "") str = str + ".";     str = str + document.form1.document[i].value;   }  }  if(str == ""){   alert("入力してください");   return false;  }else{   document.form1.submit();  } } HTML側 <form action="<%=遷移先ページ%>" method="post" name="form1"> <select 複数> <input 複数> <input type="checkbox" name="document" value="・あああ"/>あああ <input type="checkbox" name="document" value="・いいい"/>いいい <input type="checkbox" name="document" value="・ううう"/>ううう <input type="submit" value="Submit" onclick="return checkbox();">

  • フォーム上で複数の同じスクリプトを動作させるには

    選択したチェックボックスのvalue値がテキストボックスに表示されるjavascriptについてなのですが、 一つのフォーム上にclass名の異なる複数のチェックボックスを設置した場合、動作しなくなってしまいます。 正確には最初に記述したチェックボックス(下の場合はkeyword1)が動作しません。 一つのフォーム上でclass名の異なる複数のチェックボックスを設置するには、javascriptをどのように書き換えればいいのでしょうか? よろしくお願いします。 <form method="post" action="sample.cgi" name="hoge"> <td> <script language="javascript"> function check(f){ f.keyword1.value=""; for (var i=0; i<f.length;i++){ if(f[i].className=="food" && f[i].checked==true){ f.keyword1.value += f[i].value; } } f.keyword1.readOnly=(f.keyword1.value!=""); } </script> <input type="checkbox" class="food" name="food" onClick="check(this.form)" value="野菜">野菜 <input type="checkbox" class="food" name="food" onClick="check(this.form)" value="魚">魚 <input type="checkbox" class="food" name="food" onClick="check(this.form)" value="惣菜">惣菜 <input value="" size="50" type="text" name="keyword1"> </td> <td> <script language="javascript"> function check(f2){ f2.keyword2.value=""; for (var i=0; i<f2.length;i++){ if(f2[i].className=="city" && f2[i].checked==true){ f2.keyword2.value += f2[i].value; } } f2.keyword2.readOnly=(f2.keyword2.value!=""); } </script> <input type="checkbox" class="city name="city" onClick="check(this.form)" value="東京">東京 <input type="checkbox" class="city name="city" onClick="check(this.form)" value="大阪">大阪 <input type="checkbox" class="city name="city" onClick="check(this.form)" value="福岡">福岡 <input value="" size="50" type="text" name="keyword2"> </td> </form>

専門家に質問してみよう