在表单中,我有一个select选项,每个选项都有data属性.

change上,我从所选选项获得值data-size,并填充邻居的输入.这个很好用.

现在,我添加了一个加号按钮,它克隆行,这也很好用.

然而,当我(从克隆的行中) Select 一个选项时,var row = $(this).data("row");总是返回1,它属于第一行.因此,每次它都会更新第一行输入,而不是其邻居的输入.

我错过了什么吗?

var counter = 1;
$('#myform')
  .on('click', '.addInput', function(e) {
    e.preventDefault();
    counter++;
    var $template = $('.copy-row').slice(-1).clone(true, true).find('input').end()
      .find('.addInput').removeClass('addInput').addClass('removeInput').text('-').end()
      .find('[name^="cloth-"]').attr('name', 'cloth-' + counter).attr('tabindex', counter).val(null).attr('data-row', counter).end()
      .find('[name^="size-"]').attr('name', 'size-' + counter).attr('tabindex', counter).val("").end()
    $template.insertAfter('.copy-row:last');
    $('.copy-row:last').focus();

  })
  // Remove button click handler
  .on('click', '.removeInput', function(e) {
    e.preventDefault();
    var $row = $('.copy-row').slice(-1);
    counter--;
    $row.remove();
  });

$('#myform')
  .on('change', '.getclothsize', function(e) {
    var size = $(this).find('option:selected').data("size");
    var row = $(this).data("row");
    console.log("size " + size + " from row = " + row);
    if (size != null) {
      $("input[name='size-" + row + "']").val(size);
    }
  });
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>


<form id="myform">
  <div class="form-row copy-row mb-3">
    <div class="form-group col-3">
      <select name="cloth-1" data-row="1" class="custom-select getclothsize">
        <option></option>
        <option value="option1" data-size="M">option1</option>
        <option value="option2" data-size="L">option2</option>
      </select>
    </div>

    <div class="form-group col-2">
      <input name="size-1" type="text" class="form-control">
    </div>

    <div class="form-group col-2">
      <button class="btn btn-primary addInput">+</button>
    </div>
  </div>
</form>

推荐答案

主要问题是,更新size个输入中的val()个的代码行 Select 了DOM中的all个输入,而不仅仅是与更改后的select相关的输入.

您可以通过使用closest()获取行的引用,然后使用find()获取input来修复此问题,如下所示:

const $row = $(this).closest('.form-row');
$row.find('input').val('foo');

然而,值得注意的是,您可以改进逻辑.使用‘count’变量动态递增input个名称,或者添加与一行索引匹配的data个属性,这是一种很大的代码气味.

一种更好的方法是在所有表单控件上使用相同的name,并在提交到服务器时将它们作为一个数组进行处理.您还可以使用DOM遍历将同一行中的输入相互关联.

以下是一个应用了这些更新的工作示例:

const $form = $('#myform');

$form.on('click', '.addInput', function(e) {
  e.preventDefault();
  const $template = $('.copy-row').first().clone(true, true);
  $template.find('.addInput').toggleClass('addInput removeInput').text('-');
  $template.find('input').val(null);
  $template.insertAfter('.copy-row:last');
  $('.copy-row:last').focus();
});

$form.on('click', '.removeInput', function(e) {
  e.preventDefault();
  $(this).closest('.form-row').remove();
});

$form.on('change', '.getclothsize', function(e) {
  const $el = $(this);
  const $row = $el.closest('.form-row');
  const size = $el.find('option:selected').data("size");
  
  console.log("size " + size + " from row = " + $row.index());
  
  if (size) {
    $row.find("input[name='size']").val(size);
  }
});
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>


<form id="myform">
  <div class="form-row copy-row mb-3">
    <div class="form-group col-3">
      <select name="cloth" class="custom-select getclothsize">
        <option></option>
        <option value="option1" data-size="M">option1</option>
        <option value="option2" data-size="L">option2</option>
      </select>
    </div>

    <div class="form-group col-2">
      <input name="size" type="text" class="form-control">
    </div>

    <div class="form-group col-2">
      <button class="btn btn-primary addInput">+</button>
    </div>
  </div>
</form>

Jquery相关问答推荐

为什么如果使用转换规模,juserui可拖动遏制不起作用

如果链接包含多个关键字,jQuery 将 HTML 添加到链接

更改后如何使用 jQuery Select CSS 类

Flask,如何为ajax调用返回成功状态码

jQuery函数从数组中获取所有唯一元素?

jQuery 动画滚动

如何判断是否有任何 JavaScript 事件侦听器/处理程序附加到元素/文档?

使用 bootstrap-datepicker 检测对选定日期的更改

jQuery UI 滑块(以编程方式设置)

Zepto 和 jQuery 2 有什么区别?

如何使用 jQuery Select 的插件重置表单?

使用 jQuery DataTables 时禁用最后一列的排序

获取元素的底部和右侧位置

如何使用 requirejs 使 jQuery 插件可加载

JQuery Ajax Post 导致 500 内部服务器错误

JQuery:如果 div 可见

如何在纯 JavaScript 中模拟鼠标悬停以激活 CSS:悬停?

通过 javascript/jquery 删除/截断前导零

如何使用 jquery 使下拉列表只读?

如何使用 JQuery 删除onclick?