在 JavaScript 中的单个按钮上两次使用 addEventListener 和 removeEventListener

Using addEventListener and removeEventListener twice on a single button in JavaScript

我正在尝试在浏览器中创建一个秒表,其中时间是在 'capture'(允许计时器继续)或 'stop'(这也会停止计时器)时捕获的。 为此,我想要一个 html 按钮在两个标签和相应的功能('start' 和 'stop and capture')之间交替。 我尝试使用两个 addEventListener 实例,每个实例都有一个关联的 removeEventListener。看完this useful article,我写了下面的代码:

var button = document.getElementById("start");

function onStart() {  
  start();
  document.getElementById("capture").style.visibility = 'visible'; // show capture button
  document.getElementById("start").innerHTML = "Stop & Capture";

  button.addEventListener("click", function() {
    onCapture(); // assigns value to a new variable
    onStop();
    button.removeEventListener("click", arguments.callee, false); // remove this EventListener
    }, false);
}

function onStop() {  
  stop();
  document.getElementById("capture").style.visibility = 'hidden'; // hide capture button 
  document.getElementById("start").innerHTML = "Start";

  button.addEventListener("click", function() {
    onStart();
    button.removeEventListener("click", arguments.callee, false); // remove this EventListener
  }, false);
}

然而,'start' / 'stop and capture' 按钮的行为是出乎意料的,每次按下它都会保存越来越多的时间实例。我的猜测是 removeEventListener 不工作,但我可能错了。关联的 html 是:

<div>Time: <span id="time"></span></div>
    <button onclick="onStart()" id="start" class="start" style="width:150px">Start</button>
    <button onclick="onCapture()" id="capture" style="visibility:hidden">Capture</button>
    <button onclick="reset()" id="reset">Reset</button>

因此,在尝试了很长时间的各种解决方案之后,发现问题出在将 removeEventListener 与匿名函数一起使用。这是正常工作的代码:

function onStart() {
    document.getElementById("start").removeEventListener("click", onStart, false); // remove listener
    start();
    document.getElementById("capture").style.visibility = 'visible'; // show capture button
    document.getElementById("start").innerHTML = "Stop & Capture";
    document.getElementById("start").addEventListener("click", onStop, false); // add listener
}

function onStop() {
    document.getElementById("start").removeEventListener("click", onStop, false); // remove listener
    onCapture();
    stop();
    document.getElementById("capture").style.visibility = 'hidden'; // hide capture button 
    document.getElementById("start").innerHTML = "Start";
    document.getElementById("start").addEventListener("click", onStart, false);  // add listener
}