
在 html 模板中动态设置元素的 `name` 属性时,必须将模板变量用双引号包裹,否则浏览器无法识别该属性值,导致 javascript 无法通过 `[name='xxx']` 正确选取元素。
你提供的模板代码中存在一个关键语法问题:
<dd name=[% field %] class="float-right">[% order.$field %]</dd>
此处 name=[% field %] 缺少引号,导致生成的 HTML 类似于:
<dd name=id class="float-right">123</dd> <dd name=type class="float-right">active</dd> <!-- ❌ 浏览器会将其解析为 name="id"(部分兼容),但严格来说属于不规范的属性写法 -->
虽然某些浏览器可能“宽容”地解析无引号的简单标识符(如 id、type),但一旦 field 值包含连字符、数字开头或空格(例如 'last-check-dt' 或 '1st_attempt'),就会完全失效,甚至破坏 HTML 结构。
✅ 正确写法是始终为 name 属性值添加双引号(推荐)或单引号:
立即学习“前端免费学习笔记(深入)”;
[% FOREACH field IN ['id','type','updatedt','lastcheckdt'] %]
<div class="row col-md-3 col-sm-6">
<dl class="details-dl">
<label>[% field %]</label>
<div class="details-dg">
<dd name="[% field %]" class="float-right">[% order.$field %]</dd>
</div>
</dl>
</div>
[% END %]这样生成的 HTML 将是规范且可预测的:
<dd name="updatedt" class="float-right">2024-05-20 14:30:00</dd> <dd name="lastcheckdt" class="float-right">2024-05-19 09:15:22</dd>
此时,你的 JavaScript 才能可靠生效:
// ✅ 正确选取并更新
let dt_formatted = convertDateFormat("[% order.updatedt %]");
$("[name='updatedt']").text(dt_formatted); // 注意:dd 是标签,用 .text() 而非 .val()
// 若需批量处理所有字段(含格式化逻辑)
['updatedt', 'lastcheckdt'].forEach(fieldName => {
const rawValue = "[% order.$fieldName %]".trim();
if (rawValue && fieldName.includes('dt')) {
$(`[name="${fieldName}"]`).text(convertDateFormat(rawValue));
}
});⚠️ 注意事项:
- 是文本容器元素,不支持 .val() —— 应使用 .text() 或 .html() 更新内容;
- 模板中 [% order.$field %] 的插值依赖于模板引擎(如 Template Toolkit)的语法,确保后端已正确传递 order 对象及字段;
- 若字段名来自不可信来源,需做 HTML 转义(如 [% field | html %])防止 XSS,但 name 属性本身对特殊字符敏感度较低,仍建议过滤非法字符。
总结:模板变量注入 HTML 属性时,引号不是可选项,而是必需项。养成 attr="[% value %]" 的编码习惯,是保障前端 JS 交互稳定性和 HTML 合规性的基础实践。











