问题描述
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><a href="javascript:func('用a绑定');">bind by a</a><a href="javascript:func('用b绑定');">bind by b</a><input id="button" type="button" value="click" /></body></html><script type="text/javascript">function func(t1){var bt = document.getElementById('button');bt.addEventListener('click',b,false);function b(){alert(t1);}}</script>为什么多次点击bind by a或bind by b之后,再点击id为button的input,会出现多个alert窗口?重复绑定同一事件不是应该只算绑定一次吗? 问题补充:mutongwu 写道
解决方案
也就是说,每次绑定的b函数是不同的? 因为按标准来说,addEventListener多次绑定同一事件的同一函数,后面的绑定将覆盖前面的。 b函数是你在func函数内创建的闭包. 每次调用func都会重新创建一个b函数如果把b函数挪出func之外则不会发生此种情况,
解决方案二:
因为你每一次都定义了一个b.把 function b挪到 func 外面试试就知道了。
解决方案三:
addEventListener/attachEvent的事件绑定,支持同一个事件,多个处理函数。on + '事件名' 的事件绑定,仅仅支持一个处理函数。后面的绑定将覆盖前面的。