使用 jQuery 克隆表单,并添加和删除元素条件


Clone Form using jQuery with add and remove elements conditions

所以,我想克隆我的选择选项表单,当它已经满足条件时(例如,在这种情况下,用户选择"THEN"运算符),那么表单将显示固定内容(风险 - 高),隐藏特定链接(添加更多)并显示提交按钮。

困扰我的是,只有当我选择运算符时,我的代码仅适用于第一种形式。我想要的是,我希望它在添加的每个表单上执行。

例如,我需要这样的输出:

如果年龄老了,低密度脂蛋白高,高密度脂蛋白低,西斯托利高,那么 风险高

这是我的代码:

function rule(id_counter) {
  if (id_counter != 0) {
    var abc = $('#var_name' + id_counter).val();
  } else {
    var abc = $('#var_name').val();
  }
  $.ajax({
    url: 'search_coll.php',
    type: 'post',
    data: {
      selected_item: abc
    },
    success: function(response) {
      if (id_counter != 0) {
        $('#var_name' + id_counter).html(response);
      } else {
        $('#var_name').html(response);
      }
    },
    error: function() {
      console.log('Request failed.')
    }
  });
};
$(document).ready(function() {
  var count = 1;
  $('#clone').click(function() {
    var ab = $('#tobecloned').clone();
    ab.find('select').attr('id', function(i, val) {
      return val + count;
    });
    ab.find('.js_variable').attr('onChange', function(i, val) {
      return "rule("+ count +")";
    });
    $('#tab').append(ab);
    count++;
  });
});
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <table id="tab">
    <tr id="tobecloned">
      <td>
        <select name="id_var[]" id="var_name" class="js_variable" onChange="rule(0)">
          <option>Choose Variable</option>
          <?php include "../connect.php"; $query_v=m ysqli_query($connection, "SELECT * from variables ORDER BY id_var"); while($result_v=mysqli_fetch_array($query_v, MYSQLI_ASSOC)){ ?>
          <option value="<?php echo $result_v['id_var'];?>">
            <?php echo $result_v[ 'var_name'];?>
          </option>
          <?php } ?>
        </select>
      </td>
      <td>
        <select name="coll_name">
          <option>Choose Collection</option>
        </select>
      </td>
      <td>
        <select name="operator">
          <option>Choose Operator</option>
          <option value="AND">AND</option>
          <option value="THEN">THEN</option>
        </select>
      </td>
    </tr>
    <tr id="showifthen">
      <!-- i want to show this, if the user choose THEN from the last appended/cloned select operator -->
      <td>
        <select name="var_name">
          <option>Risk</option>
        </select>
      </td>
      <td>
        <select name="coll_name">
          <option>High</option>
        </select>
      </td>
    </tr>
  </table>
  <a href="#" id="clone">Add More</a> 
  <!-- this should be hidden if user choose THEN -->
  <a type="submit" id="hideatfirst" hidden>Submit</a> 
  <!-- i want this to be hidden at first, and shown when user choose THEN from the last appended/cloned select operator -->
</body>
</html>

谢谢之前

这里有一些不对劲的地方。

选择并非都具有 ID,因此尝试更新它们的循环会将它们设置为 NaN

但是,您正在对集合使用 .attr('id'),无论如何,它只返回第一个 ID,而不是所有 ID。

要依次对每个元素进行操作,请使用如下.each()

ab.find('select').each(function() {
  var el = $(this)
  el.attr('id', el.attr('id') + count)
});

为了在选择值更改时采取行动,您需要为其分配一个带有 .change() 的更改处理程序,例如

$('#operator').change(function() {
  operatorSelect($(this))
})

在克隆每个选择时,您必须为每个选择单独分配更改处理程序,并且您可能希望禁用每个先前的运算符选择,以便对更改哪个运算符没有歧义。

我发现这是一个有趣的小转移,所以我整理了一个快速的小提琴来演示:https://jsfiddle.net/xosqw00p/