无法从另一个函数中执行脚本函数myFunction的问题排查
解决动态HTML中无法执行myFunction的问题
看起来你的问题出在动态拼接HTML时的事件绑定语法错误,还有可能涉及到函数作用域的问题,我来一步步帮你搞定:
问题分析
先看你这段代码里的按钮部分:
var baan2 = "<button onclick=myFunction() class='dropbtn'>Dropdown</button>";
这里的onclick=myFunction()没有给属性值加上引号,浏览器在解析这段动态生成的HTML时,会无法正确识别这个事件绑定,导致点击按钮时找不到myFunction。另外,如果myFunction不是定义在全局作用域里,就算语法对了,动态插入的元素也没法访问到它。
另外我还发现一个小问题:你拼接HTML时重复添加了baan1(res = baan1.concat(baan1, baan2,...)),这会导致外层的dropdown div被嵌套两次,后续可能引发样式或布局问题,记得要修正。
解决方案
方案1:修复HTML拼接的引号语法
把事件属性的属性值用引号包裹起来,因为你外层用双引号包裹字符串,所以内部可以用单引号,或者转义双引号:
修改后的关键代码如下:
// 修复按钮的onclick引号 var baan2 = "<button onclick='myFunction()' class='dropbtn'>Dropdown</button>"; // 修复搜索框的onkeyup引号 var baan5 = "<div id='myDropdown' class='dropdown-content'><input type='text' placeholder='Search..' id='myInput' onkeyup='filterFunction()'"; // 去掉重复的baan1 var res = baan1.concat(baan2, baan4, baan5, baan7, baan8, baan9, baan10, baan11, baan12);
这样浏览器就能正确解析事件绑定了,前提是myFunction和filterFunction是全局作用域下的函数(比如直接定义在<script>标签里,没有嵌套在其他函数内部)。
方案2:用事件委托替代内联事件(更推荐)
内联事件(像onclick这种写在HTML里的)不是最佳实践,容易有作用域问题,也不好维护。更靠谱的方式是用事件委托,把事件绑定到已经存在的父元素上:
- 先移除拼接HTML里的内联事件:
var baan2 = "<button class='dropbtn'>Dropdown</button>"; var baan5 = "<div id='myDropdown' class='dropdown-content'><input type='text' placeholder='Search..' id='myInput'"; // 同样去掉重复的baan1 var res = baan1.concat(baan2, baan4, baan5, baan7, baan8, baan9, baan10, baan11, baan12); document.getElementById('mylocation').innerHTML = res;
- 然后绑定事件委托:
// 监听dropdown按钮的点击事件 document.getElementById('mylocation').addEventListener('click', function(e) { if (e.target.classList.contains('dropbtn')) { myFunction(); // 确保myFunction能被当前作用域访问到 } }); // 监听搜索框的keyup事件 document.getElementById('mylocation').addEventListener('keyup', function(e) { if (e.target.id === 'myInput') { filterFunction(); } });
这种方式不管元素是动态生成的还是一开始就存在的,都能正常触发事件,而且不用纠结全局作用域的问题,代码也更易维护。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

