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

函数间传递对象数组遇语法错误:点击事件传参问题排查

解决对象数组传递到内联点击事件的问题

核心问题原因

你遇到的语法错误,是因为在模板字符串中直接插入对象数组${data}时,JavaScript会自动将其转换为字符串,结果就是[object Object]——这在函数调用里属于无效语法,自然触发报错。

推荐解决方案:避免内联事件(更安全易维护)

内联事件不仅容易出现这类序列化问题,还不利于代码维护,改用事件委托是更优的方案:

// 生成不带内联点击事件的DOM结构
let recipeTitles = function(){
  return data.map(el => `<a href="#" class="recipeTitles" id="${el.id}"><h2>${el.title}</h2></a>`).join('')
}

document.querySelector('#recipeTitle').innerHTML = recipeTitles()

// 给父元素绑定事件委托,统一处理点击
document.querySelector('#recipeTitle').addEventListener('click', function(e) {
  // 找到被点击的菜谱链接元素
  const targetLink = e.target.closest('.recipeTitles')
  if (targetLink) {
    const recipeId = parseInt(targetLink.id)
    showRecipe(recipeId, data)
  }
})

function showRecipe(id, data) {
  console.log(data)
  // 根据id找到对应菜谱对象
  const targetRecipe = data.find(item => item.id === id)
  console.log(targetRecipe?.title)
}

备选方案:序列化对象数组(仅作场景兼容)

如果因为特殊场景必须使用内联点击事件,可以将对象序列化为JSON字符串,传递后再解析回来:

let recipeTitles = function(){
  // 将数组转为JSON字符串,并转义双引号避免与HTML属性冲突
  const serializedData = JSON.stringify(data).replace(/"/g, '&quot;')
  return data.map(el => `<a onClick="showRecipe(${el.id}, ${serializedData})" href="#" class="recipeTitles" id="${el.id}"><h2>${el.title}</h2></a>`).join('')
}

function showRecipe(id, dataStr) {
  // 将字符串解析回对象数组
  const data = JSON.parse(dataStr)
  console.log(data)
  const targetRecipe = data.find(item => item.id === id)
  console.log(targetRecipe?.title)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:45:41