基于Firebase的动态表格点击行触发Uncaught ReferenceError错误求助
解决动态表格点击行触发ReferenceError的问题
这个错误的根源很清晰:你把user_surname直接拼到了内联onClick的代码里,浏览器会把它当成变量名去查找,但实际上它是Firebase返回的字符串值,自然找不到对应的变量,所以抛出了ReferenceError。
举个例子,如果user_surname是"Smith",你生成的HTML会变成:
<tr onClick="displayCos(Smith)"><td>xxx</td></tr>
这里的Smith没有引号包裹,浏览器就会误以为它是一个变量,而不是字符串值,这就是问题的核心。
下面给你两种可行的解决方法,更推荐第二种更规范的实现方式:
方法1:给字符串值添加引号包裹
修改你的HTML拼接代码,给user_surname加上单引号或双引号,把它转成字符串字面量传递:
userRef.on("child_added", snap => { var username = snap.child("name").child("name").val(); var user_surname = snap.child("name").child("surname").val(); // 用模板字符串包裹,直接给变量加单引号,避免引号冲突 $("#user_table").append(`<tr onClick="displayCos('${user_surname}')"><td>${username}</td></tr>`); });
如果你的运行环境不支持ES6模板字符串,也可以用传统的字符串拼接方式:
$("#user_table").append("<tr onClick=\"displayCos('" + user_surname + "')\"><td>"+ username +"</td></tr>");
这样生成的HTML里,onClick的参数会是带引号的字符串,浏览器就会正确识别它为字符串值,而非变量。
另外别忘了补充displayCos函数(方法1需要):
function displayCos(surname) { alert(surname); }
方法2:使用事件委托(更推荐)
内联事件绑定不仅容易出现这类引号问题,还不利于代码维护和事件管理。更专业的做法是用jQuery的事件委托,给表格统一绑定点击事件,再从行元素上获取所需数据:
首先,修改HTML拼接逻辑,把姓氏存到行元素的data-*自定义属性中:
userRef.on("child_added", snap => { var username = snap.child("name").child("name").val(); var user_surname = snap.child("name").child("surname").val(); // 将姓氏存入data-surname属性 $("#user_table").append(`<tr data-surname="${user_surname}"><td>${username}</td></tr>`); });
然后给表格绑定点击事件,通过事件委托处理行的点击操作:
// 给表格绑定点击事件,委托到内部的tr元素 $("#user_table").on("click", "tr", function() { // 从data属性中取出姓氏 const surname = $(this).data("surname"); alert(surname); });
这种方式彻底避免了内联事件的引号问题,代码结构更清晰,后续修改点击逻辑也只需要调整这一个事件处理函数,维护性更强。
内容的提问来源于stack exchange,提问作者Bart Sumps
相关产品推荐
相关产品推荐

