JavaScript函数传值失效,点击事件返回{"isTrusted":true}求助
解决点击事件返回
{"isTrusted":true}的问题 嘿,我一眼就看出问题出在哪了!你遇到的这个{"isTrusted":true}其实是浏览器自动传入的事件对象,而不是你想要的那个目标对象/元素,问题根源在你的闭包写法上。
问题分析
你的代码里犯了两个关键小错误:
- 外层函数
ff接收了参数el,但返回的内层函数又重新声明了一个同名的el参数,直接把外层的el给覆盖了。 - 当点击事件触发时,浏览器会默认把事件对象作为第一个参数传给事件处理函数,所以内层函数里的
el其实是这个事件对象,自然输出的就是事件对象的JSON形式{"isTrusted":true}。
修正后的代码示例
只要去掉内层函数的el参数(或者换个不重名的参数名),利用闭包的特性就能正确访问到外层传入的目标对象:
// 修正后的ff函数 var ff = function(targetObj) { // 内层函数不再声明同名参数,直接使用外层的targetObj return function() { // 这里输出的就是你传入的计算后的对象 console.log(targetObj); alert(JSON.stringify(targetObj)); }; }; // 表格行绑定事件的示例代码 var tableRows = document.querySelectorAll('table tr'); tableRows.forEach(function(row) { // 假设你要绑定第二列 var targetCell = row.querySelector('td:nth-child(2)'); // 计算你需要的对象 var calculatedObj = { rowId: row.getAttribute('data-id'), cellValue: targetCell.textContent.trim() }; // 绑定点击事件,传入计算后的对象 targetCell.addEventListener('click', ff(calculatedObj)); });
额外注意事项
- 闭包会捕获外层函数的变量,所以只要内层函数不重名覆盖,就能保留每次传入的目标对象。
- 如果是用传统
for循环遍历行(而非forEach),要注意循环变量的作用域问题,建议用let声明循环变量,确保每次迭代的变量能被闭包正确捕获。
内容的提问来源于stack exchange,提问作者anekix
相关产品推荐
相关产品推荐

