You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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">&nbsp;-&nbsp;</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

火山引擎 最新活动