JavaScript addEventListener绑定函数直接执行问题求助
问题分析与解决方案
兄弟,你的问题出在传递事件处理函数的方式上!你写的test()是直接调用函数,而不是把函数本身作为事件监听的回调。当你写test()的时候,浏览器会立刻执行这个函数,而不是等点击事件触发时才执行。
错误原因拆解
- 当你写
document.getElementById('idtest').addEventListener('click', test(), false);时,test()会立即执行,它的返回值(这里是undefined)会被当成事件处理函数,所以点击元素时不会有任何反应,反而页面加载时就弹出了alert。 - 同样,
tmp.onclick = test()也是一样的问题,直接执行了函数,把返回值赋值给了onclick。
修正后的代码
把test()改成test(去掉括号,传递函数引用)就可以解决这个问题,而且我们还可以直接给刚创建的tmp元素绑定事件,不用再通过id查找,更高效:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ATM Interfacetest</title> <link rel="stylesheet" type="text/css" href="css/rahmen/rahmen.css"> <script> function testwindow(){ var tmp = document.createElement('div'); tmp.id = 'idtest'; tmp.className = 'classtest'; // 直接给新元素绑定事件,传递函数引用 tmp.addEventListener('click', test, false); document.getElementById('xbuttonsHeinz-Ulf').appendChild(tmp); } function test(){ alert('Alarm!'); } </script> </head> <body onload="testwindow()"> <div id="xbuttonsHeinz-Ulf" class="xbuttons"> <div id="schließenHeinz-Ulf" class="symbol">x</div> <div id="minimierenHeinz-Ulf" class="symbol"> - </div> <div id="maximierenHeinz-Ulf" class="symbol">□</div> </div> </body> </html>
其他可行方案
如果需要给函数传递参数,或者做额外处理,可以用匿名函数包裹:
// 方式1:匿名函数包裹,支持传递自定义参数 tmp.addEventListener('click', function() { test('自定义提示内容'); }, false); // 方式2:使用bind绑定参数,更简洁 function testWithMsg(msg) { alert(msg); } tmp.addEventListener('click', testWithMsg.bind(null, '点击触发的提示!'), false);
另外,也可以用DOM元素的onclick属性直接赋值函数引用:
tmp.onclick = test; // 传参数的话同样用匿名函数 tmp.onclick = function() { test('通过onclick触发'); };
内容的提问来源于stack exchange,提问作者Michael Beckmann




