@kokisstudy115 (koki tsuchiya)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

(JS,Jquery)append()やremove()を使ってプルダウンメニューを追加や削除したい。

解決したいこと

現在JavascriptやJqueryの勉強を兼ねて、擬似的なアンケートサイトを作ってます。
その中で、入力フォームを追加したり削除できるappend()やremove()を使い、
ボタンを押すと『学年を選択してください』と『年齢を選択してください』の
2つのダウンメニューを表示させたり消すことができるようにしたいのですが、なかなかうまくいきません。
ご教授いただけると幸いです。

発生している問題・エラー

現在、select要素の追加や削除ができてもプルダウンメニューの

・optipn要素の追加
・『学年を選択してください』と『年齢を選択してください』"の2つのプルダウンメニューを追加削除する

ことに対し悪戦苦戦しています。

追加ボタンを押すと....↓

スクリーンショット 2022-04-07 15.53.14.png

Selectの要素は追加される↓

スクリーンショット 2022-04-07 15.53.27.png

しかし、中身は何もない

スクリーンショット 2022-04-07 15.53.36.png

該当するソースコード

<!DOCTYPE html>
    <html lang="ja">

        <head>

            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">

            <script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
            
            <link rel="stylesheet" href="test.css">
            <link rel="preconnect" href="https://fonts.googleapis.com">
            <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
            <link href="https://fonts.googleapis.com/css2?family=M+PLUS+Rounded+1c:wght@700&display=swap" rel="stylesheet">

            <title>プロフィール</title>

        </head>

        <body>

            <h1>アンケートフォーム</h1>

                <p>子どもの年齢と学年<br><br>

                    <select id="grade" name="grade">
        
                            <option disabled selected required>学年を選択してください</option>
                            <option value="unid3">大学院博士課程 3年</option>
                            <option value="unid2">大学院博士課程 2年</option>
                            <option value="unid1">大学院博士課程 1年</option>
                            <option value="unim2">大学院修士課程 2年</option>
                            <option value="unim1">大学院修士課程 1年</option>
                            <option value="uni4">大学4年生</option>
                            <option value="uni3">大学3年生</option>
                            <option value="uni2">大学2年生</option>
                            <option value="uni1">大学1年生</option>
                            <option value="high3">専門学校/(高専も含む)</option>
                            <option value="high3">高校3年生</option>
                            <option value="high2">高校2年生</option>
                            <option value="high1">高校1年生</option>
                            <option value="jhigh3">中学3年生</option>
                            <option value="jhigh2">中学2年生</option>
                            <option value="jhigh1">中学1年生</option>
                            <option value="elementary6">小学6年生</option>
                            <option value="elementary5">小学5年生</option>
                            <option value="elementary4">小学4年生</option>
                            <option value="elementary3">小学3年生</option>
                            <option value="elementary2">小学2年生</option>
                            <option value="elementary1">小学1年生</option>
                            <option value="toddler">乳幼児未満</option>

                        
                    </select><br>
                
                    <select id="age" name="age">
        
                            <option disabled selected required>年齢を選択してください</option>
                            <option value="ages30">30歳</option>
                            <option value="ages29">29歳</option>
                            <option value="ages28">28歳</option>
                            <option value="ages27">27歳</option>
                            <option value="ages26">26歳</option>
                            <option value="ages25">25歳</option>
                            <option value="ages24">24歳</option>
                            <option value="ages23">23歳</option>
                            <option value="ages22">22歳</option>
                            <option value="ages21">21歳</option>
                            <option value="ages20">20歳</option>
                            <option value="ages19">19歳</option>
                            <option value="ages18">18歳</option>
                            <option value="ages17">17歳</option>
                            <option value="ages16">16歳</option>
                            <option value="ages15">15歳</option>
                            <option value="ages14">14歳</option>
                            <option value="ages13">13歳</option>
                            <option value="ages12">12歳</option>
                            <option value="ages11">11歳</option>
                            <option value="ages10">10歳</option>
                            <option value="ages9">9歳</option>
                            <option value="ages8">8歳</option>
                            <option value="ages7">7歳</option>
                            <option value="ages6">6歳</option>
                            <option value="ages5">5歳</option>
                            <option value="ages4">4歳</option>
                            <option value="ages3">3歳</option>
                            <option value="ages2">2歳</option>
                            <option value="ages1">1歳</option>
                            <option value="ages0">0歳</option>
                    
                    </select></p>

                    <div id='child'></div>

                    <input type='button' id='btnAdd'/><br>

                    <input type='button' id='btnDel'/>

                <hr>

                <div class="button">

                    <button type="submit" id="button" onclick="send_userProfile()">保存</button>
                    
                </div>


            </form>

        </body>

        <script>

            $(function(){                
                $("#btnAdd").val("追加").on('click', function() {

                    // 要素数
                    var n = $(".child").length + 1;

                    // 追加する要素文字列
                    var dom = "<div class='child' id='child-" + n + "'>";
                        dom += "<select name='age' id='age" + n + "' onChange='changeInput(this)'/>";
                        dom += "</div>";

                    // 要素を追加
                    $("#child").append(dom);
                });

                $("#btnDel").val("削除").on('click', function() {

                    // 要素数
                    var n = $(".child").length;

                    // 要素数が0の場合戻る
                    if (n <= 0) return;
                    
                    // 要素の削除
                    $(`#child-${n}`).remove();
                });
            });
            function changeInput(d){
                alert("id:" + d.id + "の値が" + $(d).val() + "に変更された。");
            }
        </script>

    </html>

最後に

まだ学び始めて5日しか経っておらず理解がまだ追いついてないことも多くありますが、皆様のお知恵をお借りしステップアップできるように頑張ります。
どうかよろしくお願いいたします。

0 likes

2Answer

やりたいことがよくわからないです。
追加を押すと具体的にどうなるようにする予定ですか?

0Like

Comments

  1. @kokisstudy115

    Questioner

    わかりづらくてすみません。
    画面上に『学年を選択してください』と『年齢を選択してください』の2つのプルダウンメニューが見えると思うんですが、追加ボタンを押すと、この2つと同じプルダウンメニューを表示させたいのです。

それに対して選択中のoption要素を追加するという意味ならこんなでしょうか

                    // 追加する要素文字列
                    var selectedGrade = $("#grade option:selected");
                    var selectedAge = $("#age option:selected");
                    var dom = "<div class='child' id='child-" + n + "'>";
                        dom += "<select name='grade' id='grade" + n + "' onChange='changeInput(this)'>";
                        dom += "<option value='" + selectedGrade.val() + "'>" + selectedGrade.text();
                        dom += "</select>";
                        dom += "<select name='age' id='age" + n + "' onChange='changeInput(this)'>";
                        dom += "<option value='" + selectedAge.val() + "'>" + selectedAge.text();
                        dom += "</select>";
                        dom += "</div>";

たぶん違うと思いますが本当にまるごと同じメニューを表示したいならこうして下さい

                    // 追加する要素文字列
                    var dom = $("<div class='child' id='child-" + n + "'>");
                    dom.append($("#grade, #age").clone().attr("id", ""));

どっちも違うがなという場合はご指摘下さい。


追記:

                    // 追加する要素文字列
                    var dom = $("<div class='child' id='child-" + n + "'>");
                    dom.append( $("#grade, #age").clone().attr("id", function(i, id){return id + n}).on("change", function(){changeInput(this)}) );
0Like

Comments

  1. @kokisstudy115

    Questioner

    ありがとうございます、実は2つ目の同じメニューを表示したかったので、助かりました。
    domに関する知識が皆無なので、これを機に勉強してみようと思います。ありがとうございました。
  2. すみませんそっちは多分違うだろうと思って適当に書いたので、changeInputが動作しません
    一応動作するようにしたものを追記致しましたのでご覧いただけますと幸いです
  3. @kokisstudy115

    Questioner

    ご丁寧にありがとうございます!今から勉強してみます

Your answer might help someone💌