HTML 中如何正确为元素的 name 属性动态赋值

在 html 模板中使用模板语法(如 template toolkit)动态设置元素的 `name` 属性时,必须将插值表达式用英文双引号包裹,否则浏览器无法识别该属性值,导致 javascript 无法通过 `[name="xxx"]` 准确选取元素。

你提供的代码片段中,关键问题在于

标签的 name 属性缺少外层引号:

[% order.$field %]

这会导致最终生成的 HTML 类似于:

2025-03-15

浏览器会把 name=[% field %] 当作一个无值或非法属性处理(实际等效于 name 布尔属性),因此 $( "[name='updatedt']" ) 完全匹配不到任何元素。

✅ 正确写法是为 name 属性值添加双引号,确保模板引擎输出的是合法、可被 CSS 选择器识别的 HTML:

[% FOREACH field IN ['id','type','updatedt','lastcheckdt'] %]
    
        
[% order.$field %]
[% END %]

渲染后将得到标准 HTML:

2025-03-15 14:22:08

此时,JavaScript 可正常操作:

// ✅ 成功获取并更新
let dt_formatted = convertDateFormat("[% order.updatedt %]");
$("[name='updatedt']").text(dt_formatted); // 注意:dd 元素用 .text() 而非 .val()

⚠️ 注意事项:

  • dd 是语义化描述列表项,不支持 value 属性,因此应使用 .text() 或 .html() 更新内容,而非 .val()(.val() 仅适用于表单控件如 input/select/textarea);
  • 若需后续通过 name 批量操作,建议统一添加 data-field 属性作为更语义化的替代方案;
  • 在调试时,可通过浏览器开发者工具「Elements」面板查看实际渲染出的 HTML,确认 name 属性是否已正确输出。

总结:模板变量插入 HTML 属性值时,引号不是可选项,而是必需项——它决定了属性能否被正确解析与选择。