You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Web应用中JavaScript如何正确转义产品名里的撇号等字符?

解决自定义产品名称含单/双引号导致应用崩溃的问题

嘿,这个问题我太熟了——你碰到的是内联事件处理中字符串未转义导致的语法断裂,同时还暗藏XSS安全风险呢!当item.name里包含单引号时,它会直接闭合gaRemoveFromCart('里的单引号,让JS代码语法彻底混乱,自然就崩溃了。下面给你两种解决方案,优先推荐第一种:

方案1:彻底抛弃内联事件(最安全、最推荐)

内联onClick这种写法本来就容易踩转义的坑,还容易被注入恶意代码。更好的方式是直接用JS创建DOM元素,然后绑定事件,完全不用把数据嵌到HTML字符串里:

// 先为每个商品创建对应的DOM元素
const cartElements = items.map(item => {
  // 创建列表项和删除按钮
  const li = document.createElement('li');
  const removeBtn = document.createElement('a');
  
  // 设置按钮的属性
  removeBtn.href = '#';
  removeBtn.className = 'btn-remove';
  removeBtn.title = 'Remove This Item';
  removeBtn.innerHTML = '<i class="fas fa-times"></i>';
  
  // 直接绑定点击事件,无需转义!
  removeBtn.addEventListener('click', () => {
    cartLS.remove(item.id);
    gaRemoveFromCart(item.name); // 这里直接用item对象的属性,完全不用担心引号问题
  });
  
  li.appendChild(removeBtn);
  return li;
});

// 清空购物车容器,再把所有元素加进去
$cart.innerHTML = '';
cartElements.forEach(element => $cart.appendChild(element));

这种方法的好处:

  • 彻底避免了转义问题,因为我们直接引用item对象的原始数据
  • 消除了XSS风险,哪怕用户输入了<script>这类恶意内容也不会被执行
  • 代码逻辑更清晰,后期维护更方便

方案2:如果不得不保留字符串拼接,手动转义单引号

如果你暂时没法重构代码,那可以写一个简单的转义函数,把item.name里的单引号替换成转义后的\',确保不会破坏JS语法:

// 定义转义单引号的工具函数
function escapeSingleQuotes(str) {
  // 全局替换所有单引号为转义单引号
  return str ? str.replace(/'/g, "\\'") : '';
}

// 在拼接HTML时使用这个函数
$cart.innerHTML = items.map((item) => `
  <a href="#" onClick="cartLS.remove(${item.id}); gaRemoveFromCart('${escapeSingleQuotes(item.name)}');" title="Remove This Item" class="btn-remove">
    <i class="fas fa-times"></i>
  </a>
</div>
</li>
`).join("");

注意:这种方法只能解决当前的崩溃问题,但依然存在XSS风险(比如用户输入<img src=x onerror="alert('xss')">这类内容时,会被执行),所以还是优先考虑方案1。

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

火山引擎 最新活动