JavaScript中onClick调用自定义函数失效问题求助
问题分析与解决方案
这个问题核心是作用域不匹配导致的,咱们来拆解清楚:
你通过mywin.document.write生成的<td>元素,属于新窗口mywin的文档上下文。而你定义的test2()函数,是在主窗口的全局作用域里的。当点击单元格触发onClick='test2()'时,浏览器会去新窗口的全局作用域里找这个函数——找不到自然就没反应,而且这种内联事件的“函数未找到”错误,有时候不会显示在主窗口的控制台里(得看新窗口的控制台才会发现)。
至于为什么alert(this.innerText)和window.close()能正常工作?因为这俩都是浏览器原生的全局方法,新窗口的window对象本身就自带这些方法,所以直接调用没问题。
给你两个靠谱的解决方案:
方案1:把函数挂载到新窗口的作用域里
在调用document.write之前,把test2函数绑定到新窗口的全局对象上,这样新窗口就能找到它了:
// 先给新窗口的全局对象添加test2函数 mywin.test2 = function() { alert("hi"); }; // 再生成td元素 mywin.document.write("<td onClick='test2()'>" + this.tArray[i] + "</td>");
方案2:用事件绑定替代内联onclick(更推荐)
内联事件本身就容易引发作用域问题,更现代的做法是创建元素后通过addEventListener绑定事件,这样能直接复用主窗口里的test2函数:
// 创建td元素 const td = mywin.document.createElement('td'); td.textContent = this.tArray[i]; // 绑定点击事件,这里直接用主窗口的test2函数 td.addEventListener('click', test2); // 记得把td添加到对应的表格行中(假设你有对应的<tr>元素) targetRow.appendChild(td);
这种方式不仅避免了作用域问题,代码结构也更清晰,后期维护起来更方便。
内容的提问来源于stack exchange,提问作者Chris Gaus
相关产品推荐
相关产品推荐

