JS按钮onclick传参报错:第三个字符串参数未定义求助
嘿,这个问题我太熟悉啦!你遇到的报错核心原因很明确:第三个参数没有被当作字符串处理,浏览器把它当成了一个未定义的变量。
为什么会触发这个错误?
你在拼接onclick内联事件的时候,response.authResponse.accessToken是一个长字符串类型的令牌(比如你看到的EAAEozLZBF2kgBACWvosqJN3ugl2vImHGIdPqsN9NQqXHw3EExaEQ7ePnUbLJxuu2Uu7ZCXYLg5qvil7fhnzc56zZCxBgmnMJwgPdcEsQJzZCWC2apzdJbFZAOrh4g4PO2ZAakk2l269HD0SxiiZB3TqHjNmRuS93Md9S22kPJ6xnIactGkjhfvqMhtmw5sqK60ZD),但你直接把它拼进了代码里,没有用引号包裹。浏览器解析这段内联代码时,会把这段令牌当作变量名去查找,自然找不到对应的变量,就抛出了ReferenceError。
前两个参数没问题,大概率是因为item[i].id和sessionStorage.getItem("pageId")是数字类型,直接拼接会被浏览器当作数字解析,不会触发变量查找逻辑。
快速修复方案(修改字符串拼接)
给所有字符串类型的参数加上转义的单引号,确保浏览器把它们当作字符串处理:
$('<ul style="list-style:none;"><li><span style="font-weight: bold; color: white;">Message </span><span style="color: white;">' + item[i].message + '</span><br/><span style="font-weight: bold; color: white;">Date</span><span style="color: white;"> ' + formatDate(date) + '</span><button style="float:right" id="' + item[i].id + '" onclick="postComment(' + item[i].id + ', \'' + sessionStorage.getItem("pageId") + '\', \'' + response.authResponse.accessToken + '\')">Add Comment</button > <hr /></li></ul>').appendTo('#wellForPageFeed');
这里用\'转义单引号,避免和外面的onclick="..."双引号冲突,同时把pageId和accessToken都包裹成字符串格式。
更推荐的方案(使用jQuery事件绑定)
内联onclick很容易出现这类字符串拼接问题,而且不利于代码维护。更专业的做法是用jQuery的.on()方法绑定事件,彻底避免引号困扰:
// 先创建元素结构(用ES6模板字符串让代码更清晰) var $commentItem = $(` <ul style="list-style:none;"> <li> <span style="font-weight: bold; color: white;">Message </span> <span style="color: white;">${item[i].message}</span> <br/> <span style="font-weight: bold; color: white;">Date</span> <span style="color: white;"> ${formatDate(date)}</span> <button style="float:right" id="${item[i].id}">Add Comment</button> <hr /> </li> </ul> `); // 给按钮绑定点击事件 $commentItem.find('button').on('click', function() { postComment( item[i].id, sessionStorage.getItem("pageId"), response.authResponse.accessToken ); }); // 把元素添加到目标容器 $commentItem.appendTo('#wellForPageFeed');
这里用模板字符串让HTML结构更易读,同时直接在事件回调里传递参数,完全不需要处理字符串拼接的引号问题,代码可读性和可维护性都更高。
内容的提问来源于stack exchange,提问作者John Long




