当所有选择框都有一个名称时,如何从 DOM 添加/删除选择框,以便在提交时从活动选择框获得值?

Posted

技术标签:

【中文标题】当所有选择框都有一个名称时,如何从 DOM 添加/删除选择框,以便在提交时从活动选择框获得值?【英文标题】:How can I add/remove select boxes from DOM when all select boxes have one name so that upon Submit I get value from active select box? 【发布时间】:2021-08-08 05:19:59 【问题描述】:

TL;DR:当我有多个同名的选择框时,我希望能够使用当前活动的 html select 框进行选择,但任何时候只有一个选择框处于活动状态.

--

我的问题是 - 我有多个 filename 选择框,在提交时,始终发送位于 HTML 底部且 HTTP 请求中具有 filename 名称的最后一个选择框的值。我想找到一种方法只发送与当前活动的a_XX_row 框相关联的filename,而不发送任何其他的。

即我选择 40 的 id,我应该只看到“A-40 Designer and Specs”的框,而不是 800 框。当我按下提交时,我希望 POST['filename'] 有“A-40 Designer and Specs”,但我总是得到“A-800 Designer E.xlsm”,因为它是最后一个select HTML 文件。

$('#modelid').on('change', function() 
    
    if (this.value == 40)
        $('.a_40_row').show();
    else
        $('.a_40_row').hide();

    if (this.value == 800)
        $('.a_800_row').show();
    else
        $('.a_800_row').hide();

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form><table>
  <tr>
    <td>
      <select name="id" id="modelid">
        <option value="0">--select--
        <option value="40">40
          <option value="800">800
      </select>
    </td>
  </tr>
  <tr class="a_40_row" style="display: none;">
    <td>Version</td>
    <td>
      <select name="filename">
        <option selected>A-40 Designer and Specs B.xlsm</option>
        <option>A-40 Designer and Specs A.xlsm</option>
      </select>
    </td>
  </tr>
  <tr class="a_800_row" style="display: none;">
    <td>Version</td>
    <td>
      <select name="filename">
        <option>A-800 Designer E.xlsm</option>
      </select>
    </td>
  </tr>
  <tr>
    <td><input type="submit"></td>
  </tr>
</table></form>

【问题讨论】:

在主题上,不要隐藏和显示不同的控件,用你需要的填充控件。根据您的需要。在一个完整的旁注......不要使用table标签进行布局。 ^ 这将是一个可接受的解决方案。 .... 为此,我需要预加载所有可能的 filenames,然后在我认为选择时动态加载它们 【参考方案1】:

不显示/隐藏选择表单。

您只需要在第一个选择更改时更新第二个选择

这样做的方法:

const 
  myForm = document.forms['my-form']
, filenames = 
  [  model:  '40', cod: 'A-40-B',  fn:'A-40 Designer and Specs B.xlsm' 
  ,  model:  '40', cod: 'A-40-A',  fn:'A-40 Designer and Specs A.xlsm' 
  ,  model: '800', cod: 'A-800-E', fn:'A-800 Designer E.xlsm'          
  ]  

myForm.modelid.onchange = () =>
  
  myForm.filename.innerHTML = ''
  filenames
    .filter(x=>x.model===myForm.modelid.value)
    .forEach( filename=>
      
      myForm.filename.add( new Option(filename.fn,filename.cod))
      
    )
  
select,
button 
  display : block;
  float   : left;
  clear   : left;
  margin  : .3em;
  
select  
  min-width : 8em;
  padding   : 0 .3em;
    
  
<form name="my-form">
  <select name="modelid" >
    <option value="" selected disable >--select--</option>
    <option value="40"  >  40 </option>
    <option value="800" > 800 </option>
  </select>
 
  <select name="filename"></select>
 
  <button type="submit">submit</button>
</form>

【讨论】:

【参考方案2】:

两个选项,

    在显示元素时启用/禁用元素。 用您需要的内容填充一个字段。

选项 1:

$('#modelid').on('change', function() 
    //Set visibility
    $('.a_40_row').toggle(this.value == 40);
    //Toggle disabled
    $('.a_40_row [name=filename]').prop("disabled", this.value != 40);
    $('.a_800_row').toggle(this.value == 800)
    $('.a_800_row [name=filename]').prop("disabled", this.value != 800);    
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form><table>
  <tr>
    <td>
      <select name="id" id="modelid">
        <option value="0">--select--</option>
        <option value="40">40</option>
          <option value="800">800</option>
      </select>
    </td>
  </tr>
  <tr class="a_40_row" style="display: none;">
    <td>Version</td>
    <td>
      <select name="filename" disabled>
        <option selected>A-40 Designer and Specs B.xlsm</option>
        <option>A-40 Designer and Specs A.xlsm</option>
      </select>
    </td>
  </tr>
  <tr class="a_800_row" style="display: none;">
    <td>Version</td>
    <td>
      <select name="filename" disbled>
        <option>A-800 Designer E.xlsm</option>
      </select>
    </td>
  </tr>
  <tr>
    <td><input type="submit"></td>
  </tr>
</table></form>

选项 2: - 这使用 HTML 5,在 IE 10 及更低版本中存在问题

$('#modelid').on('change', function() 
   $(".row").show();
   var selVal = $(this).val();
   //Go through the options
   $("[name=filename] option").each(function()
     //Dont use jquerys data here, it will convert to a number when it can
     //Get array of values where can display from the data attribute
     var arrDisplay = this.dataset.display.split(",");
     //Add the hidden property if not contained in array -- wont work in IE 10 and older
     $(this).prop("hidden", !arrDisplay.includes(selVal));
     //Set a default
     $(this).prop("selected", $(this).data("optiondefault") && !arrDisplay.includes(selVal) )
   );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form><table>
  <tr>
    <td>
      <select name="id" id="modelid">
        <option value="0">--select--</option>
        <option value="40">40</option>
          <option value="800">800</option>
      </select>
    </td>
  </tr>
  <tr class="row" style="display: none;">
    <td>Version</td>
    <td>
      <select name="filename">
        <option data-display="40" data-optiondefault="true">A-40 Designer and Specs B.xlsm</option>
        <option data-display="40">A-40 Designer and Specs A.xlsm</option>
        <option data-display="800" data-optiondefault="true">A-800 Designer E.xlsm</option>
        <option data-display="40,800">Hybrid</option>
      </select>
    </td>
  </tr>
  <tr>
    <td><input type="submit"></td>
  </tr>
</table></form>

【讨论】:

以上是关于当所有选择框都有一个名称时,如何从 DOM 添加/删除选择框,以便在提交时从活动选择框获得值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 for 循环将列值添加到数据框字典中,以便每个数据框都有一个唯一的列?

当这些列的名称与列表中的名称匹配时,如何跨熊猫列添加所有值?

两个文本框,一个按钮,js怎样判断,点击按钮时,两个文本框都为空,则提示必填一个,两个都有内容?

当我尝试从网页添加 DOM 元素时,我的数组得到 0 值,如何将值添加到 .each 函数中的列表?

当用户从选择框中选择选项时更改输入字段的值

寻找动态添加/删除框,但在下拉值上隐藏字段