【问题标题】:Automatically remove the selected option in drop down when the row is cloned克隆行时自动删除下拉列表中的选定选项
【发布时间】:2019-09-16 05:58:35
【问题描述】:

function cloneRow() {
  var row = document.getElementById("dropdowns");
  var table = document.getElementById("tableDrop");
  var clone = row.cloneNode(true);
  clone.id = "dropdowns";
  table.appendChild(clone);
  var x = document.getElementById("beansDrop");
  x.remove(x.selectedIndex);
}
<div class="modal-body">
  <form method="post" action="adeliveries.php">
    <table align="center">
      <tr>
        <td>Supplier:</td>
        <td id="num">
          <select name="num">
            <?php while($row1 = mysqli_fetch_array($result2)):;?>
            <option value="<?php echo $row1[3];?>">
              <?php echo $row1[1], " - " , $row1[3];?>
            </option>
            <?php endwhile;?>
          </select>
        </td>
      </tr>
    </table>
    <div style="overflow-x:auto;">
      <table id="tableDrop">
        <tr>
          <th>
            <h5>COFFEE BEAN</h5>
          </th>
          <th>
            <h5>QUANTITY(kg)</h5>
          </th>
          <th>
            <h5>REMOVE ORDER</h5>
          </th>
        </tr>

        <tr id="dropdowns">
          <td id="beansDropdown">
            <select name="beans[]" id="beansDrop">
              <?php while($row1 = mysqli_fetch_array($result1)):;?>
              <option value="<?php echo $row1[1], " - ";?>">
                <?php echo $row1[1];?>
              </option>
              <?php endwhile;?>
            </select>
          </td>
          <td id="quantity">
            <input type="number" name="quan[]" placeholder="enter quantity" required>
          </td>
          <td id="remove">
            <input type="button" value="&#10006;" onclick="RemoveOrder()">
          </td>
        </tr>
      </table>
    </div>
    <table>
      <br>
      <tr>
        <td><input type="button" onclick="cloneRow()" value="Add Order" class="btn btn-secondary" /></td>
        <td><input type="submit" name="abc" value="Send" class="btn btn-primary" /></td>
      </tr>
    </table>
  </form>
</div>

我正在创建一个简单的订单表单,用户可以从下拉菜单中选择咖啡豆类别并输入数量。有一个添加订单按钮,如果用户希望订购另一个,它将克隆该行。当我单击添加订单时,我可以做些什么来自动隐藏或删除选定的 bean/s?因为它只是简单地克隆了行。

我尝试过循环,但我对它的逻辑感到困惑。

每次我克隆该行时,它也会在每个下拉菜单中被删除,包括我从中选择它的下拉菜单。

function cloneRow(){
  var row = document.getElementById("dropdowns");
  var table = document.getElementById("tableDrop");
  var clone = row.cloneNode(true);
  clone.id = "dropdowns";
  table.appendChild(clone);
  var x = document.getElementById("beansDrop");
  x.remove(x.selectedIndex);
}
<tr id="dropdowns">                                          
  <td id="beansDropdown">
    <select name="beans[]" id="beansDrop">
      <option value="beans1">beans1</option>
      <option value="beans2">beans2</option>
      <option value="beans3">beans3</option>
      <option value="beans4">beans4</option>
    </select>
  </td>
  <td id="quantity">
    <input type="number" name="quan[]" placeholder="enter quantity" required>
  </td>
  <td id="remove">
    <input type="button" value="&#10006;" onclick="RemoveOrder()">
  </td>
</tr>

【问题讨论】:

  • 您的标记中的 php 代码破坏了示例代码 sn-p,因此我将其转换为静态示例标记。
  • 我还添加了缺少的按钮来触发克隆以及&lt;table&gt;,所以我们有一个最小的示例。
  • 虽然这不是您遇到的问题,但是当您克隆时,您会复制 ID,并且它们应该是唯一的。
  • @imvain2 我最近弄清楚了这个逻辑,但是当我尝试这样做时,我已经对如何编码感到困惑。我不太习惯 JavaScript,而且我在构建代码时遇到了困难。虽然我得到了一些逻辑,但我很难将它应用到我的代码中。
  • @Connum 我已经编辑了 sn-p 并添加了 html 文件的一些部分。

标签: javascript html


【解决方案1】:

首先 id 选择器应该是唯一的,所以在这种情况下最好使用 class。在您的代码中,您始终会获得第一个下拉菜单并删除所选值。要使其正常工作,请获取最后一个下拉列表,克隆它并从克隆中删除选定的值。

function cloneRow(e) {
  e.preventDefault();
  var row = document.querySelector(".dropdowns:last-child");
  var tableBody = document.querySelector("#tableDrop tbody");
  var clone = row.cloneNode(true);
  clone.querySelector('.beansDrop').remove(row.querySelector('.beansDrop').selectedIndex);
  tableBody.appendChild(clone);
}
<table id="tableDrop">
  <tr class="dropdowns">
    <td class="beansDropdown">
      <select name="beans[]" class="beansDrop">
        <option value="beans1">beans1</option>
        <option value="beans2">beans2</option>
        <option value="beans3">beans3</option>
        <option value="beans4">beans4</option>
      </select>
    </td>
    <td id="quantity">
      <input type="number" name="quan[]" placeholder="enter quantity" required>
    </td>
    <td id="remove">
      <input type="button" value="&#10006;" onclick="RemoveOrder()">
    </td>
  </tr>
</table>
<button onClick="cloneRow(event)" type="button">add order</button>

仅供参考:如果您想从所有其他下拉列表中删除所选元素,则必须遍历所有下拉列表。


禁用而不是删除元素。

function cloneRow(e) {
  e.preventDefault();
  var row = document.querySelector(".dropdowns:last-child");
  var tableBody = document.querySelector("#tableDrop tbody");
  var clone = row.cloneNode(true);
  var clonedDrop = clone.querySelector('.beansDrop');
  var lastDrop = row.querySelector('.beansDrop');
  clonedDrop.value = '';
  if (lastDrop.selectedIndex != -1) clonedDrop.options[lastDrop.selectedIndex].disabled = true;
  tableBody.appendChild(clone);
}


function RemoveOrder(ele) {
  var row = ele.closest('tr');
  var drop = row.querySelector('.beansDrop');
  var alldrop = document.querySelectorAll('.beansDrop');
  if (drop.selectedIndex != -1)
    alldrop.forEach(ele => ele.options[drop.selectedIndex].disabled = false)
  row.remove();
}
<table id="tableDrop">
  <tr class="dropdowns">
    <td class="beansDropdown">
      <select name="beans[]" class="beansDrop">
        <option value="beans1">beans1</option>
        <option value="beans2">beans2</option>
        <option value="beans3">beans3</option>
        <option value="beans4">beans4</option>
      </select>
    </td>
    <td id="quantity">
      <input type="number" name="quan[]" placeholder="enter quantity" required>
    </td>
    <td id="remove">
      <input type="button" value="&#10006;" onclick="RemoveOrder(this)">
    </td>
  </tr>
</table>
<button onClick="cloneRow(event)" type="button">add order</button>

仅供参考:要在更改下拉列表时更新禁用属性,您必须实现更改事件处理程序。

【讨论】:

  • 我尝试将此代码集成到我的代码中,也进行了仔细检查,如果我单击“添加订单”按钮,它只会将我刷新到同一页面并且不会克隆该行。
  • @JaverickCynjynnP.Aqui : &lt;button onClick="cloneRow()" type="button"&gt;add order&lt;/button&gt; .. 添加type 属性
  • 非常感谢您的帮助,它成功了!但是有一个小问题,当我删除订单并单击“添加订单”时,最新的下拉菜单不会显示已删除的 bean,并且无法再选择。有没有办法在移除 bean 后在其他下拉菜单中再次显示它?
  • @JaverickCynjynnP.Aqui :最好禁用而不是删除
  • 效果很好!非常感谢你帮助我。祝您有美好的一天,Pranav。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2016-07-24
  • 2020-01-10
  • 2020-11-13
  • 1970-01-01
  • 2020-01-31
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多