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

jQuery动态ID元素绑定click事件无法正确获取域名值问题

问题场景

需求为点击表格行内的保存图标时,在控制台打印当前行对应的域名。现有代码静态值测试运行正常,确认问题和动态生成的ID相关:打印截取得到的id值输出正常,但始终无法正确获取到对应的domain值。

涉及的原代码如下:

<?php
// 后端渲染表格行逻辑
$dns_zone = ["domain" => "user", "domain2" => "user2"];
foreach ($dns_zone as $dom => $user){
 echo '
<tr id="tr'.$dom.'">
<td>
    <span>'.$dom.'</span>
    <input type="hidden" id="name'.$dom.'" name="domain" value="'.$dom.'" />
</td>
<td>
    <i class="save" id="sid'.$dom.'" title="Save"></i>
</td>   
</tr>';
}
?>
// 前端保存点击逻辑
$(document).on("click", ".save", function() {
  var id = $(this).attr("id");
  id = id.substr(3);
  var domain = $("#name"+id).val();
  console.log(domain);
});
问题根因

你踩了jQuery选择器的语法解析坑:域名通常包含.这类选择器元字符,当你拼接出的选择器为#namexxx.com格式时,jQuery不会把xxx.com当成完整ID,而是会把.com解析为class筛选条件,实际匹配的是「id为namexxx、同时带有com类名的元素」,当然找不到你预设的隐藏输入框,最终取到的value为空或undefined。
你单独打印截取后的id字符串是完全正常的,但这个字符串传入jQuery构造函数做选择器时会被按语法拆分解析,这就是你排查时觉得逻辑全对但拿不到值的核心原因。

修复方案

优先推荐第一种写法,完全不依赖动态ID,鲁棒性最高:

  • 方案1:通过DOM相对位置查找元素,彻底规避ID特殊字符问题
$(document).on("click", ".save", function() {
  // 从当前点击的保存按钮向上找到最近的tr行,再在该行内找存域名的隐藏输入框
  const domain = $(this).closest('tr').find('input[name="domain"]').val();
  console.log(domain);
});

这种写法不需要关心ID怎么生成、有没有特殊字符,只要表格行的DOM结构不变就能正常工作,后续改ID规则也不会影响这段逻辑。

  • 方案2:保留原有ID拼接逻辑,绕过jQuery选择器解析
    如果一定要用ID匹配,不要把拼接后的字符串传给jQuery当选择器,直接用原生的getElementById方法,该方法会把传入的字符串当做完整ID精确匹配,不会解析特殊字符:
$(document).on("click", ".save", function() {
  const id = this.id.substr(3);
  const domain = document.getElementById('name' + id).value;
  console.log(domain);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:57:21