0
0

More than 1 year has passed since last update.

JSでname属性を前方一致で複数取得したい

Last updated at Posted at 2022-01-22

前方一致で取得する

「onclick」でJSの関数を呼び出して引数にformを渡す場合、欲しい要素が1つならこの方法でも取れるみたい

<form onsubmit="return false">
    <input type="text" name="AAA_a">
    <input type="submit" onclick="func(this.form)">
</form>
<script>
    function func(form){
        console.log(form[name ^= 'AAA_']);
    }
</script>

でも欲しい要素が複数の場合、これではできない。。。
そこでこうする

<form onsubmit="return false">
    <input type="text" name="AAA_a">
    <input type="text" name="AAA_b">
    <input type="text" name="AAA_c">
    <input type="submit" onclick="func(this.form)">
</form>
<script>
    function func(form){
        let elements = form.querySelectorAll('[name^="AAA_"]');
    }
</script>

このように、引数に対して「querySelectorAll」を指定して前方一致にすることで配列で取得できるようになる

formの入力チェックを追加する際、name属性を前方一致で複数取得する必要性があったとする

  • class及びidの追加はなしで行う
  • このページにはformが複数存在し、入力チェックは送信するform事に行う
  • 入力欄は動的に作成される(今回の例では3個と1個で固定)
  • チェックする入力欄のname属性は必ず"AAA_"から始まる
  • 半角数字のみ受け付けるようなチェック内容を追加する
<body>
    <form onsubmit="return false">
        <input type="text" name="AAA_a">
        <input type="text" name="AAA_b">
        <input type="text" name="AAA_c">
        <input type="submit" onclick="func(this.form)">
    </form>
    <form onsubmit="return false">
        <input type="text" name="AAA_d">
        <input type="submit" onclick="func(this.form)">
    </form>


    <script>
        function func(form){
            let elements = form.querySelectorAll('[name^="AAA_"]');
            elements.forEach((element)=>{

                //ここで入力チェックを行う
                let val = element.value.trim();// 入力数

                if(val == '' || val == 0) {
                    err_tex = "数字を入力してください";

                }else if(!val.match(/.*[^0-90-9].*/)){
                    order_quantity = val.replace(/[0-9]/g,
                        function( match_num ) {
                            return String.fromCharCode( match_num.charCodeAt(0) - 0xFEE0 );
                        }
                    );
                    element.value = order_quantity

                }else{
                    err_tex = "半角数字で入力してください";
                }
            });
            if(err_tex){
                alert(err_tex);
            }else{
              form.submit();
            }
        }
    </script>
</body>

とこんな感じで。。。。

でも・・・さ
name属性を配列にしておけばいいのに、思ってしまう、、、まぁ仕方ないですね

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0