4

当点击每个 div 时,如果点击了 div 1,它应该提示“1”,如果点击了 div 2,它应该提示“5”。我试图让这段代码尽可能简单,因为这是一个更大的应用程序所需要的。

<html>
<head>
<style type="text/css">
#div1 { background-color: #00ff00; margin: 10px; padding: 10px; }
#div2 { background-color: #0000ff; margin: 10px; padding: 10px; }
</style>
<script type="text/javascript">

function init()
{
  var total = 1;

  var div1 = document.getElementById('div1'),
      div2 = document.getElementById('div2');

  var helper = function(event, id)
  {
      if (event.stopPropagation) event.stopPropagation();
      if (event.preventDefault) event.preventDefault();

      alert('id='+id);
  }

  div1.addEventListener('click', function(event) { helper(event, total); }, false);

  total += 4;

  div2.addEventListener('click', function(event) { helper(event, total); }, false);

}

</script>
</head>

<body onload="init();">

<div id="div1">1</div>
<div id="div2">2</div>

</body>
</html>

谢谢你的帮助!:-)

4

2 回答 2

8

问题是事件侦听器和“总计”都存在于同一范围内(init())

事件函数总是会在 init() 范围内引用总计,即使在声明事件函数之后它被更改

为了解决这个问题,事件函数需要在自己的范围内有一个不会改变的“总数”。您可以使用匿名函数添加另一层范围

例如:

(function (total) {
    div1.addEventListener('click', function(event) { helper(event, total); }, false);
}(total));

total += 4;

(function (total) {
  div2.addEventListener('click', function(event) { helper(event, total); }, false);
}(total));

匿名函数将 init() 的当前“总”值作为参数传递。这为匿名函数的范围设置了另一个“总计”,因此 init() 的总计是否更改并不重要,因为事件函数将首先引用匿名函数的范围。

编辑:

此外,您需要在辅助函数的右大括号之后放置一个分号,否则脚本会抱怨“事件”未定义。

var helper = function(event, id)
{
  if (event.stopPropagation) event.stopPropagation();
  if (event.preventDefault) event.preventDefault();

  alert('id='+id);
};
于 2009-11-22T20:26:24.693 回答
2

这几乎相同,但我认为它会更好:

div1.addEventListener('click', function(t){ return function(event) { helper(event, t); }}(total), false);

代替:

(function (total) {
    div2.addEventListener('click', function(event) { helper(event, total); }, false);
}(total));
于 2009-11-22T21:19:09.290 回答