JavaScript中的闭包和onclick事件

3

我有一个关于Javascript事件冒泡的简单示例,在这个jsfiddle上(点击人会冒泡到猪)。我该如何使用闭包将var interval = 0;移出全局范围,但保留在HTML中的onclick="display('sometext')"

var interval = 0;

function display(animal) {
  window.setTimeout(function() { showText(animal) }, interval);
  interval = interval+300;
  window.setTimeout(function() { clear() }, interval);
}

function showText(animal) {
  $(".alGore").text(animal.toUpperCase());
    $("."+animal+"-box").css({'background-color':'#ff0'});
}

function clear(animal) {
  $(".alGore").text('');
  $("*").css({background: 'transparent'});
  interval = 0;
}

请在您的帖子中包含最相关的代码部分。链接通常可用于提供更多上下文,但不应是唯一的参考。 - Jonathan Lonowski
你可以将它包装在IIFE中,然后向相关的div添加事件侦听器,而不是使用onclick属性。 - char
1个回答

3
你可以将一个函数嵌套在另一个函数中,以创建闭包。但是,如果你有两个函数想要绑定到同一个闭包中,你需要一个对象。
看看这个https://jsfiddle.net/axrpcaq4/16/
var animalBox = function(){
  var interval = 0;
  return {
    display: function(animal) {
      var that = this;
      window.setTimeout(function() { that.showText(animal) }, interval);
      interval = interval+300;
      window.setTimeout(function() { that.clear() }, interval);
    },
    showText: function(animal) {
      $(".alGore").text(animal.toUpperCase());
      $("."+animal+"-box").css({'background-color':'#ff0'});
    },
    clear: function(animal) {
      $(".alGore").text('');
      $("*").css({background: 'transparent'});
      interval = 0;
    }
    }
}();

并且HTML:

<div class="center">
  <div class="pig-box center" onclick="animalBox.display('pig')">
    <img src="http://i.imgur.com/MumugGd.png" alt="pig" class="icon">     
      <div class="bear-box center" onclick="animalBox.display('bear')">
        <img src="http://i.imgur.com/p7L5DHL.png" alt="bear" class="icon">    
          <div class="man-box center" onclick="animalBox.display('man')">
            <img src="http://i.imgur.com/cKvJT7T.png" alt="man" class="icon">
          </div>
      </div>
  </div>
  <div class="alGore"></div>
</div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接