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

JS动态设置data属性取值遇空格截断问题解决

问题描述

从对象数组渲染菜单列表时,将菜品title字段存入按钮的data-title自定义属性,点击按钮读取属性值打印到控制台时,title内容在第一个空格处截断,空格后内容全部丢失。
相关实现代码:

const menu = [
  {
    id: 1,
    title: "GUNPOWDER GOBHI",
    category: "Small Plates",
    price: 16.99,
    img: "sp1.png",
    desc: `Crispy Cauliflower, Spicy Lentil Dust`,
  },
]

window.addEventListener("DOMContentLoaded", function () {
  initialDisplay(menu);
});

function diplayMenuItems(menuItems) {
  let displayMenu = menuItems.map(function (item) {
    return `<article class="menu-item">
          <img src=${item.img} alt=${item.title} class="photo" />
          <div class="item-info">
            <h4>${item.title}</h4>
            <h4 class="price">$${item.price}</h4>
            <p class="item-text">
              ${item.desc}
            </p>
            <button class="add-btn" data-title=${item.title}>Add To List</button>
          </div>
        </article>`;
  });
  displayMenu = displayMenu.join("");

  sectionCenter.innerHTML = displayMenu;

  const addBtns = document.querySelectorAll('.add-btn');
  addBtns.forEach(function(btn){
    btn.addEventListener('click', function(e){
      const title = e.currentTarget.dataset.title;
      console.log(title);
    });
  });
}

代码逻辑:DOM加载完成后调用方法渲染菜单列表,渲染时直接将菜品title赋值给按钮的data-title自定义属性;渲染完成后为所有添加按钮绑定点击事件,点击时通过e.currentTarget.dataset.title读取存储的title值打印,此时控制台仅能输出第一个空格前的内容。

故障原因

拼接HTML字符串时,动态赋值的标签属性没有用引号包裹。
按照HTML解析规则,不带引号的属性值遇到空白字符就会终止解析,空格后的内容会被识别为标签上的独立属性,不会被计入当前属性的值。以上述代码的按钮为例,最终渲染出的DOM结构为:

<button class="add-btn" data-title=GUNPOWDER GOBHI>Add To List</button>

浏览器会将data-title的属性值解析为GUNPOWDER,后面的GOBHI会被识别为按钮上的一个无值自定义属性,读取时自然无法拿到完整内容。
提示:代码中img标签的src、alt属性也存在相同问题,如果后续图片路径、替换文本包含空格,会出现图片加载失败、alt文本截断的同类问题。

修复方案

给所有动态插入的HTML属性值添加双引号包裹,注意模板字符串的引号嵌套不要冲突即可。
修复后的模板片段如下:

return `<article class="menu-item">
          <img src="${item.img}" alt="${item.title}" class="photo" />
          <div class="item-info">
            <h4>${item.title}</h4>
            <h4 class="price">$${item.price}</h4>
            <p class="item-text">
              ${item.desc}
            </p>
            <button class="add-btn" data-title="${item.title}">Add To List</button>
          </div>
        </article>`;

修改后浏览器可以正确解析包含空格的属性值,点击按钮时即可获取完整的title内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:24:24