如何在同一个按钮位置中循环浏览多个按钮

时间:2019-02-21 06:29:40

标签: javascript html function button event-handling

我正在创建一个显示当前运行时间的秒表。我需要创建一个在“开始”,“停止”和“重置”之间循环的按钮。

它应以“开始”开始,单击该按钮将转到“停止”,随后应以“复位”结束。然后循环通过它们。

我还没有在线找到任何解释此问题的指南。而且我似乎无法自行解决。

        start = document.getElementById('Start');
        stop = document.getElementById('Stop');
        reset = document.getElementById('Reset');
        
        let watchRunning = false;

        Start.addEventListener('click', startHandler);
        Stop.addEventListener('click', stopHandler);
        Reset.addEventListener('click', resetHandler);

        function startHandler() {
            if (!watchRunning) {
                watchRunning = setInterval(update, 70);
            }
        }
        function stopHandler() {
            clearInterval(watchRunning);
            watchRunning = null;
        }
        function resetHandler() {
            document.getElementById("Time").innerHTML = "00.00";
            clearInterval(watchRunning);
            watchRunning = false;
        }

        update();
        var seconds;
        var milliseconds;
        var d;

        function update() {
            d = new Date();
            seconds = d.getSeconds();
            milliseconds = Math.floor((d.getMilliseconds() / 10));

            if (milliseconds < 10 && seconds < 10) {
                document.getElementById("Time").innerHTML =
                    "0" + seconds + ".0" + milliseconds;

            } else if (milliseconds < 10 && seconds >= 10) {
                document.getElementById("Time").innerHTML =
                    seconds + ".0" + milliseconds;

            } else if (milliseconds >= 0 && seconds < 10) {
                document.getElementById("Time").innerHTML =
                    "0" + seconds + "." + milliseconds;

            } else if (milliseconds >= 0 && seconds >= 10) {
                document.getElementById("Time").innerHTML =
                    seconds + "." + milliseconds;
            }
        }
#Time {
     background-color: yellow;
     max-width: 2.3%;
}
<h1>Stop Watch</h1>
<button id="Start">Start</button>
<button id="Stop">Stop</button>
<button id="Reset">Reset</button>
<h3>Elapsed Time:</h3>
<p id="Time"></p>

2 个答案:

答案 0 :(得分:1)

也许您可以稍微改变一下思路,而不是三个按钮,将您的想法封装为一个,然后将其称为秒表。每次单击该按钮时,它将进入下一个状态并执行关联的处理程序功能。这就是我的意思:

var startHandler = function (state) { console.log(state); }
var stopHandler = function (state) { console.log(state); }
var resetHandler = function (state) { console.log(state); }

var StopWatch = function (selector) {
  var states = ['Start', 'Stop', 'Reset']
  var handlers = [startHandler, stopHandler, resetHandler]
  var currentState = 0;
  var element = document.querySelector(selector);

  var clickHandler = function () {
    // Execute 'currentState', pass anything you want to handlers
    handlers[currentState](states[currentState])

    // Update currentState after, means 'move to next state'
    if (currentState < (states.length - 1)) {
      currentState++;
    } else {
      currentState = 0;
    }

    element.innerHTML = states[currentState];
  }
  return {
    init: function () {
      // Initial work
      element.addEventListener('click', clickHandler);
    },
    remove: function () {
      // Cleanup
      element.removeEventListener('click', clickHandler)
    }
  }
}

StopWatch('#stopwatch').init();

这是一个可运行的示例框架:

https://jsbin.com/zawomorori/edit?html,js,console

答案 1 :(得分:0)

我修改了您的代码以创建所需的效果。我已经使用jquery隐藏和显示有关单击事件的按钮。

 <!DOCTYPE html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <style type="text/css">
    body{
        margin: 0px;
        width: 100%;
        padding: 0px;
    }
        #Time {
     background-color: yellow;
     max-width: 2.3%;
}
.box{
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-65%);    
}
</style>

</head>
<body>
<div class="box">
<h1>Stop Watch</h1>
<button id="Start">Start</button>
<button id="Stop" >Stop</button>
<button id="Reset">Reset</button>
<h3>Elapsed Time:</h3>
<p id="Time"></p>
</div>
<script type="text/javascript">

$('document').ready(function(){
 $("#Stop").prop("disabled",true);
 $("#Reset").prop("disabled",true);
 $("#Stop").prop("hidden",true);
 $("#Reset").prop("hidden",true);
}); 

$('#Start').click(function(){
 $("#Stop").prop("disabled",false);
 $("#Reset").prop("disabled",true);
 $("#Stop").prop("hidden",false);
 $("#Reset").prop("hidden",true);
 $("#Start").prop("disabled",true);
 $("#Start").prop("hidden",true);
});
$('#Stop').click(function(){
 $("#Reset").prop("disabled",false);
 $("#Reset").prop("hidden",false);
 $("#Stop").prop("disabled",true);
 $("#Stop").prop("hidden",true);
});

$('#Reset').click(function(){
 $("#Start").prop("disabled",false);
 $("#Start").prop("hidden",false);
 $("#Reset").prop("disabled",true);
 $("#Reset").prop("hidden",true);
});

        start = document.getElementById('Start');
        stop = document.getElementById('Stop');
        reset = document.getElementById('Reset');

        let watchRunning = false;

        Start.addEventListener('click', startHandler);
        Stop.addEventListener('click', stopHandler);
        Reset.addEventListener('click', resetHandler);

        function startHandler() {
            if (!watchRunning) {
                watchRunning = setInterval(update, 70);
            }
        }
        function stopHandler() {
            clearInterval(watchRunning);
            watchRunning = null;
        }
        function resetHandler() {
            document.getElementById("Time").innerHTML = "00.00";
            clearInterval(watchRunning);
            watchRunning = false;
        }

        update();
        var seconds;
        var milliseconds;
        var d;

        function update() {
            d = new Date();
            seconds = d.getSeconds();
            milliseconds = Math.floor((d.getMilliseconds() / 10));

            if (milliseconds < 10 && seconds < 10) {
                document.getElementById("Time").innerHTML =
                    "0" + seconds + ".0" + milliseconds;

            } else if (milliseconds < 10 && seconds >= 10) {
                document.getElementById("Time").innerHTML =
                    seconds + ".0" + milliseconds;

            } else if (milliseconds >= 0 && seconds < 10) {
                document.getElementById("Time").innerHTML =
                    "0" + seconds + "." + milliseconds;

            } else if (milliseconds >= 0 && seconds >= 10) {
                document.getElementById("Time").innerHTML =
                    seconds + "." + milliseconds;
            }
        }
</script>

</body>
</html>