选择时表单中的重复字段

Posted

技术标签:

【中文标题】选择时表单中的重复字段【英文标题】:Duplicate fields in a form upon selection 【发布时间】:2021-02-10 21:26:45 【问题描述】:

我制作了一个表格来选择技能。做出第一个选择后,将显示第二个列表,其中包含取决于第一个选择的选项。 然后,“+”按钮允许复制字段并添加另一个技能。

我的问题:

初始表单是好的,但是当我按“+”时,创建的第二个表单不起作用(第二个“选择字段”没有根据第一个选择进行过滤。

你能帮忙吗?

非常感谢。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Skill form</title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js" /></script>

  
</head>
  
    <body>
        <h1>Insert your skills</h1>
        <div class="copycat">
            <div id="form">
                <form action="" method="post" name="addbloc">
                    <p>
                         <label for="tpl">Family :</label>
                        <select name="tpl" id="tpl">
                            <option value="">-- Select your family --</option>
                            <option value="Language" data-id='#champ1'>Language</option>
                            <option value="Cooking" data-id='#champ2'>Cooking</option>
                        </select><br />

                            <div class="champ" id="champ1">
                                <label for="Language">Skill :</label>
                                <select name="Language" id="Language">
                                    <br/>
                                    <option value="">-- Select your skill --</option>
                                    <option value="Spanish" data-id='#champ1'>Spanish</option>
                                    <option value="Chineese" data-id='#champ1'>Chineese</option>
                                    <option value="French" data-id='#champ1'>French</option>
                                </select><br />

                                <input onclick="copycat();" id="button" value="+" type="button">
                           </div>

                            <div class="champ" id="champ2">
                                <label for="Cooking">Skill :</label>
                                <select name="Cooking" id="Cooking">
                                    <br/>
                                    <option value="">-- Select your skill --</option>
                                    <option value="Italian" data-id='#champ2'>Italian</option>
                                    <option value="Mexican" data-id='#champ2'>Mexican</option>
                                    <option value="Japanese" data-id='#champ2'>Japanese</option>
                                    <option value="Greek" data-id='#champ2'>Greek</option>
                                </select><br />

                                <input onclick="copycat();" id="button" value="+" type="button">
                            </div>
                    </p>
     
                </form>
                
            </div>     
        </div>        

        <!-- WIP ----- Submit button to store in database -->
        <div style="z-index:99;"><input type="submit" name="Submit" value="Submit" class="bouton"></div>
 

    <script type="text/javascript">
    
            // Show 2nd field according to first field selection
            $(document).ready(function() 
                $('.champ').hide(); // on cache les champ par défaut
                
                $('select[name="tpl"]').change(function()  // lorsqu'on change de valeur dans la liste
                    $('.champ').hide();
                    var selectedDataID = $(this).find('option:selected').attr('data-id');
                    $(selectedDataID).show();
                );
            );


            // Duplicate field when + button is pressed  
            function copycat()
                $('.copycat:first').clone().appendTo($('#form'));
            

    </script>

    </body>
</html>

【问题讨论】:

“未过滤”是什么意思? 如果我在第一个字段(家庭)中选择“烹饪”,我应该在第二个字段中看到“意大利、墨西哥、日本和希腊”。 啊,好的。明白了。 如果我在第一个字段(家庭)中选择“语言”,我应该在第二个字段中看到“西班牙语、中国语和法语”。但是复制后就不行了。 明白。感谢您的澄清。 【参考方案1】:

您不能将相同的ids 用于不同的元素,因此我将id 更改为html 属性,即:data-id。然后,当您从选择框中选择任何选项时,只有在@987654324 内的div @ 不应该更改其他动态添加的内容,因此请使用 $(this).closest("form").. 在表单 htmls 中进行更改。最后,这些元素是动态创建的,所以请使用$(document).on('change', 'select[name="tpl"]',..

此外,您的copycat 函数正在复制整个 div,因此下次如果您按 +,它将显示 2 的选择副本等。要解决此问题,请使用 $('.copycat form:first')...

演示代码

$(document).ready(function() 
  $('.champ').hide();

  $(document).on('change', 'select[name="tpl"]', function() 
    $(this).closest("form").find('.champ').hide(); //hide the champ div inside form which is there
    var selectedDataID = $(this).find('option:selected').attr('data-id');
    //get the div with dta-id of slected option
    $(this).closest("form").find("div[data-id=" + selectedDataID + "]").show();
  );
);


// Duplicate field when + button is pressed  
function copycat() 
//copy first form 
  $('.copycat form:first').clone().appendTo($('#form'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Insert your skills</h1>
<div class="copycat">
  <div id="form">
    <form action="" method="post" name="addbloc">
      <p>
        <label for="tpl">Family :</label>
        <!--instead of id added data-id -->
        <select name="tpl" id="tpl">
          <option value="">-- Select your family --</option>
          <option value="Language" data-id='champ1'>Language</option>
          <option value="Cooking" data-id='champ2'>Cooking</option>
        </select><br />
        <!--added data-id-->
        <div class="champ" data-id="champ1">
          <label for="Language">Skill :</label>
          <select name="Language" id="Language">
            <br/>
            <option value="">-- Select your skill --</option>
            <option value="Spanish" data-id='#champ1'>Spanish</option>
            <option value="Chineese" data-id='#champ1'>Chineese</option>
            <option value="French" data-id='#champ1'>French</option>
          </select><br />

          <input onclick="copycat();" id="button" value="+" type="button">
        </div>
        <!--added data-id-->
        <div class="champ" data-id="champ2">
          <label for="Cooking">Skill :</label>
          <select name="Cooking" id="Cooking">
            <br/>
            <option value="">-- Select your skill --</option>
            <option value="Italian" data-id='#champ2'>Italian</option>
            <option value="Mexican" data-id='#champ2'>Mexican</option>
            <option value="Japanese" data-id='#champ2'>Japanese</option>
            <option value="Greek" data-id='#champ2'>Greek</option>
          </select><br />

          <input onclick="copycat();" id="button" value="+" type="button">
        </div>
      </p>

    </form>

  </div>
</div>

<!-- WIP ----- Submit button to store in database -->
<div style="z-index:99;"><input type="submit" name="Submit" value="Submit" class="bouton"></div>

【讨论】:

谢谢@Swati。你让我很开心,我从你的回复中学到了很多东西!我希望有一天我能帮助你作为回报! :-) 乐于助人:)

以上是关于选择时表单中的重复字段的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:重复字段(和字段组):表单模型绑定

WordPress小部件中的重复表单字段?

在处理我的表单之前验证 select2 字段[重复]

表单字段中的中心光标[重复]

mysql php从2个表中选择字段,具有相同的字段名称[重复]

在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段