You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为循环动态生成的文本框分配唯一ID并对应到各尺寸区块?

解决循环生成带唯一ID输入框的问题

我明白你现在遇到的困扰了——你的jQuery脚本把所有8个输入框都塞进了第一个尺寸区块的#addition容器里,这是因为HTML中ID必须是唯一的,jQuery的$('#addition')只会匹配到页面中第一个带有该ID的元素,自然所有输入框都堆在了第一个区块里。

其实根本不需要用JS来动态生成这些输入框,直接在PHP的循环里就能生成带唯一ID的输入框,而且更简单可靠。下面是具体的解决方案:

方案一:服务器端(PHP)直接生成带唯一ID的输入框

这是最推荐的方式,因为服务器端渲染更高效,也避免了客户端JS的延迟问题。

修改后的PHP代码

<?php
// 获取上一页扫描的数组数据
$strings = explode(PHP_EOL,($_SESSION['grid']));
$sa = [];
foreach ($strings as $s) {
  array_push($sa, "'" . $s . "'");
}
$d=implode(',', $sa);
// SQL查询
$sql = "select distinct size from items where main_group IN(select distinct main_group from items where addl_item_code_barcode IN ($d)) ORDER BY size";
$result = pg_query($db, $sql);

// 初始化计数器,用来生成唯一ID(从1开始对应add1到add8)
$inputCounter = 1;
?>

<div class="row">
  <!-- 循环生成每个尺寸区块 -->
  <?php while($res = pg_fetch_assoc($result)){ ?>
  <div class="col-md-2 show-hide">
    <input type="text" value="<?php echo $res['size']; ?> " readonly style="background-color: #F5F5F5;" class="form-control"/>
    <!-- 直接在这里生成带唯一ID的输入框 -->
    <input class="form-control sync-input" type="text" name="add<?php echo $inputCounter; ?>" id="add<?php echo $inputCounter; ?>" />
    <select class="form-control">
      <option>25%</option>
      <option>50%</option>
      <option>100%</option>
    </select><br>
  </div>
  <?php
  // 每次循环计数器+1,保证ID唯一
  $inputCounter++;
  }
  ?>
</div>
<br>
<br>
<button type="submit" value="submit" class="btn btn-primary"><i class="fas fa-paint-brush"></i>Apply</button>
</form>

优化同步脚本(避免硬编码ID)

原来的sync函数需要逐个写死ID,非常不灵活。可以用类选择器批量处理所有需要同步的输入框:

function sync() {
  // 获取主输入框的值
  const mainValue = document.getElementById('add0').value;
  // 选择所有带有sync-input类的输入框(也就是循环生成的那些)
  const syncInputs = document.querySelectorAll('.sync-input');
  // 批量设置值
  syncInputs.forEach(input => {
    input.value = mainValue;
  });
}

方案二:如果一定要用客户端JS生成输入框

如果你坚持要用JS动态生成,那需要把重复的ID改成类,然后遍历每个容器逐个添加输入框:

修改HTML结构(把ID改成类)

在PHP循环里把<div id="addition"></div>改成:

<div class="addition"></div>

修改JS脚本

$(document).ready(function() {
  // 遍历所有带有addition类的容器
  $('.addition').each(function(index) {
    // index从0开始,所以ID用index+1来对应add1到add8
    const inputId = 'add' + (index + 1);
    // 给当前容器添加输入框
    $(this).append(`<input class="form-control sync-input" type="text" name="${inputId}" id="${inputId}" />`);
  });
});

同样搭配上面优化后的sync函数即可。

为什么原来的方法失效?

  • HTML规范要求ID必须唯一,你的循环生成了8个<div id="addition"></div>,这本身就不符合规范。
  • jQuery的$('#addition')只会匹配页面中第一个带有该ID的元素,所以所有输入框都被插入到了第一个尺寸区块里。

内容的提问来源于stack exchange,提问作者Cooper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:41:59