Javascript 暂停设置间隔然后继续时出现问题
我在建造计时器时遇到了一个小问题。一切进展顺利,但简言之,它就是这样做的:Javascript 暂停设置间隔然后继续时出现问题,javascript,html,Javascript,Html,我在建造计时器时遇到了一个小问题。一切进展顺利,但简言之,它就是这样做的: 用户可以设置他/她想要学习或做任何活动的时间 用户按下开始键 开始按钮变为“停止”按钮 计时器从用户选择的时间开始倒计时 一旦计时器达到0,带有停止和按钮的时钟将变回“开始”,所有内容将重置为0:00 注意 一旦用户点击开始按钮或开始按钮,如果能够通知用户,设备将振动 问题 我的问题是,当时钟运行时,用户按下“停止学习”按钮,时钟停止,是的,这很好,但当他/她再次按下按钮时(现在应该是“开始”按钮,因为它基本上已暂停)
问题 我的问题是,当时钟运行时,用户按下“停止学习”按钮,时钟停止,是的,这很好,但当他/她再次按下按钮时(现在应该是“开始”按钮,因为它基本上已暂停),然后,时钟取给定的时间,从用户给定的时间开始计时,直到0:00才继续 我查阅了一些文章,我使用了变量,在布尔状态之间切换,并检查时钟是否正在运行
isRunning = !isRunning
我看到一些人说我应该使用:
clearInterval(name);
这不起作用,因为我不想清除时钟的状态,或者可能我做错了
代码 可在此处找到小提琴的链接:
HTML
<br/>
<div class="timer" id="startingTimer">
<p class="title" id="state">Break</p>
<p id="time">00:00</p><span ng-style="{'height':fillHeight, 'background':fillColor }" class="fill" style="height: 0.933333%; background: rgb(153, 204, 0);"></span>
</div>
<br/>
<div class="session" id="toggleSessionStart">
<div class="timer control startingTimercontroller" id="startingTimercontroller">
<p class="title controlTitle" id="StartTimer">Start Study</p>
</div>
<!--<div class="timer control startingPauseTimercontroller" id="startingPauseTimercontroller">
<p class="title controlTitle" id="StartPauseTimer">Start Break</p>
</div>--></div>
<br/>
<header>
<div class="session">
<div class="sessionCtrl">
<p>session length</p>
<input type="number" class="time" id="valueTimerSession" value="10">
</div>
<!--<div class="breakCtrl">
<p>break length</p>
<input type="number" class="time" id="valueTimerBreak" value="5">
</div>--></div>
</header>
JS
body {
background: #333333;
color: #fff;
}
#time {
font-size: 90px;
position: relative;
top: -40px;
}
@media (max-width: 500px) {
#time {
font-size: 90px;
position: relative;
top: -80px;
}
}
.plus {
background-color: #333333;
color: #fff;
border: none;
cursor: pointer;
font-size: 2em;
outline: none;
}
.time {
font-size: 2.5em;
padding-left: 10px;
padding-right: 10px;
width: 100%;
}
.minus {
background-color: #333333;
color: #fff;
border: none;
cursor: pointer;
font-size: 2em;
outline: none;
}
header {
display: flex;
justify-content: center;
text-align: center;
margin: 0 auto;
color: #fff;
text-transform: uppercase;
padding: 20px;
}
.session .breakCtrl, .session .sessionCtrl {
display: inline;
padding-left: 30px;
padding-right: 30px;
}
.session {
font-size: .8em;
display: flex;
}
.timer {
margin: 0 auto;
text-align: center;
width: 300px;
height: 300px;
font-size: 4em;
border: 2px solid #99CC00;
border-radius: 50%;
cursor: pointer;
position: relative;
z-index: 20;
overflow: hidden;
}
.control {
margin: 0 auto;
text-align: center;
width: 120px;
height: 120px;
font-size: 4em;
border: 2px solid #99CC00;
border-radius: 50%;
cursor: pointer;
position: relative;
z-index: 20;
overflow: hidden;
font-family: sans-serif;
}
.startingTimercontroller {
background: #37B703 !important;
border: 2px solid #fff;
}
.startingPauseTimercontroller {
background: #B70000 !important;
border: 2px solid #fff;
}
.title {
margin: 45px;
margin-bottom: -30px;
}
.controlTitle {
font-size: 28px;
position: relative;
top: 25px;
margin: 0;
}
.heading {
text-align: center;
font-size: 50px;
text-transform: uppercase;
font-family: sans-serif;
}
//event Listener
var clickStart = document.getElementById("toggleSessionStart");
//pauseing the clock
var clockRunning = false;
var clicked = false;
//getting the user value ammount to study and break for
var valueTimerSession = parseInt(document.getElementById('valueTimerSession').value);
function pomodoro(studyTime) {
this.studyTime = studyTime;
this.seconds = 59;
this.timerDOM = document.getElementById("time");
this.state = document.getElementById("state");
this.toggleSessionStart = document.getElementById('toggleSessionStart');
}
pomodoro.prototype.startStudyTicker = function () {
var thisStudyTicker = this;
var seconds = this.seconds - 1;
var DOM = this.timerDOM;
var minutes = this.studyTime - 1;
var loopingSeconds = seconds;
var state = this.state;
var toggleSessionStart = this.toggleSessionStart;
if (clicked && clockRunning) {
console.log('We are runnung');
window.ticker = setInterval(function () {
//save the minutes to global variable
window.minSaved = minutes;
window.secSaved = loopingSeconds;
console.log("The time saved is " + window.minSaved + ":" + window.secSaved);
console.log(minutes + ":" + loopingSeconds);
var tick = loopingSeconds--;
if (loopingSeconds >= 0) {
tick;
DOM.innerHTML = minutes.toString() + ":" + (loopingSeconds < 10 ? '0' + loopingSeconds.toString() : loopingSeconds.toString());
} else {
if (minutes > 0) {
minutes--;
loopingSeconds = seconds;
tick;
DOM.innerHTML = minutes.toString() + ":" + (loopingSeconds < 10 ? '0' + loopingSeconds.toString() : loopingSeconds.toString());
}
if (minutes <= 0) {
//vibrate - Timer is Done
window.navigator.vibrate(300);
console.log('im finished');
clearInterval(ticker);
}
}
}, 1000);
} else {
if (!clicked && !clockRunning) {
clearInterval(ticker);
}
}
}
pomodoro.prototype.stopStudyTicker = function () {
var thisStudyTickerStop = this;
console.log('We are paused');
clearInterval(ticker);
thisStudyTickerStop.startStudyTicker();
}
//get the session title
var sessionTitle = document.getElementById('state');
//the DOM toggle
function toggleDOM(chosenTime) {
if (clicked && clockRunning) {
//started the session - the Title
sessionTitle.innerHTML = "Session";
clickStart.innerHTML =
'<div class="timer control startingPauseTimercontroller" id="startingPauseTimercontroller"><p class="title controlTitle" id="StartTimer">Stop Study</p></div>';
//vibrate
window.navigator.vibrate(300);
//prototype execution
var startStudy = new pomodoro(chosenTime);
startStudy.startStudyTicker();
} else {
sessionTitle.innerHTML = "Break";
clickStart.innerHTML =
'<div class="timer control startingTimercontroller" id="startingTimercontroller"><p class="title controlTitle" id="StartTimer">Start Study</p></div>';
//vibrate
window.navigator.vibrate([100, 100, 100]);
//prototype execution
var stopStudy = new pomodoro();
stopStudy.stopStudyTicker();
}
}
clickStart.addEventListener('click', function () {
//user clicked and the clock starts
clicked = !clicked;
clockRunning = !clockRunning;
//valueTimerBreak = parseInt(document.getElementById('valueTimerBreak').value);
valueTimerSession = parseInt(document.getElementById('valueTimerSession').value);
//the Toggle
toggleDOM(valueTimerSession);
});
//事件侦听器
var clickStart=document.getElementById(“toggleSessionStart”);
//暂停时钟
var clockRunning=false;
var=false;
//获取要学习和中断的用户值amount
var valueTimerSession=parseInt(document.getElementById('valueTimerSession').value);
函数pomodoro(studyTime){
this.studyTime=studyTime;
这个秒=59;
this.timerDOM=document.getElementById(“时间”);
this.state=document.getElementById(“state”);
this.toggleSessionStart=document.getElementById('toggleSessionStart');
}
pomodoro.prototype.startstudyicker=函数(){
var thistudyticker=this;
var seconds=this.seconds-1;
var DOM=this.timerDOM;
var minutes=this.studyTime-1;
var loopingSeconds=秒;
var state=this.state;
var toggleSessionStart=this.toggleSessionStart;
如果(单击并计时运行){
log(“我们正在运行”);
window.ticker=setInterval(函数(){
//将分钟数保存到全局变量
window.minSaved=分钟;
window.secSaved=循环秒;
console.log(“节省的时间为“+window.minSaved+”:“+window.secSaved”);
日志(分钟+:“+循环秒);
var tick=循环秒--;
如果(循环秒>=0){
打上钩
DOM.innerHTML=minutes.toString()+“:”+(loopingSeconds<10?'0'+loopingSeconds.toString():loopingSeconds.toString());
}否则{
如果(分钟>0){
分钟--;
循环秒=秒;
打上钩
DOM.innerHTML=minutes.toString()+“:”+(loopingSeconds<10?'0'+loopingSeconds.toString():loopingSeconds.toString());
}
如果(分钟我没有真正理解你的代码,但我自己做了,基本上如果你点击一个按钮,秒不存储在一个变量中-存储它们,否则就继续循环。我想你会理解我的代码,用我的代码替换你的javascript
var clickStart = document.getElementById("toggleSessionStart");
var pomodoro = function() {
this.inProgress = false;
this.studyTime = null;
this.timerInstance = null;
this.timerDOM = document.getElementById("time");
this.stateElement = document.getElementById("state");
this.toggleSessionStart = document.getElementById('toggleSessionStart');
}
pomodoro.prototype = {
start: function() {
var parent = this;
if(this.studyTime === null) this.studyTime = parseInt(document.getElementById('valueTimerSession').value, 10) * 60;
this.timerInstance = setInterval(function() {
parent.studyTime--;
if(parent.studyTime < 1) parent.destroy();
else parent.updateTime();
}, 1000);
return this;
},
pause: function() {
clearInterval(this.timerInstance);
this.timerInstance = null;
return this;
},
destroy: function() {
this.pause();
this.studyTime = null;
this.toogleState(false);
this.timerDOM.innerHTML = '00:00';
return this;
},
updateTime: function() {
var totalSec = this.studyTime,
minutes = Math.floor(totalSec / 60),
seconds = totalSec % 60;
this.timerDOM.innerHTML = (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds);
return this;
},
toogleState: function(state) {
this.inProgress = (typeof state !== 'undefined') ? state : !this.inProgress;
if(this.inProgress) {
this.stateElement.innerHTML = "Session";
clickStart.innerHTML = '<div class="timer control startingPauseTimercontroller" id="startingPauseTimercontroller"><p class="title controlTitle" id="StartTimer">Stop Study</p></div>';
this.start();
}
else {
this.stateElement.innerHTML = "Break";
clickStart.innerHTML = '<div class="timer control startingTimercontroller" id="startingTimercontroller"><p class="title controlTitle" id="StartTimer">Start Study</p></div>';
this.pause();
}
window.navigator.vibrate(300);
return this;
}
};
var pomodoroInstance = new pomodoro();
clickStart.addEventListener('click', function () {
pomodoroInstance.toogleState();
});
var clickStart=document.getElementById(“toggleSessionStart”);
var pomotoro=函数(){
this.inProgress=false;
this.studyTime=null;
this.timerInstance=null;
this.timerDOM=document.getElementById(“时间”);
this.stateElement=document.getElementById(“状态”);
this.toggleSessionStart=document.getElementById('toggleSessionStart');
}
波莫多罗原型={
开始:函数(){
var parent=此;
如果(this.studyTime===null)this.studyTime=parseInt(document.getElementById('valueTimerSession')。值,10)*60;
this.timerInstance=setInterval(函数(){
parent.studyTime--;
如果(parent.studyTime<1)parent.destroy();
else parent.updateTime();
}, 1000);
归还这个;
},
暂停:函数(){
clearInterval(这是timerInstance);
this.timerInstance=null;
归还这个;
},
销毁:函数(){
这个。暂停();
this.studyTime=null;
这个。toogleState(false);
this.timerDOM.innerHTML='00:00';
归还这个;
},
updateTime:function(){
var totalSec=this.studyTime,
分钟=数学楼层(总秒/60),
秒=总秒%60;
this.timerDOM.innerHTML=(分钟<10?“0”+分钟:分钟)+“:”+(秒<10?“0”+秒:秒);
归还这个;
},
toogleState:函数(状态){
this.inProgress=(状态类型!=“未定义”)?状态:!this.inProgress;
如果(本程序中){
this.stateElement.innerHTML=“会话”;
单击start.innerHTML='停止研究;
这个。start();
}
否则{
this.stateElement.innerHTML=“Break”;
单击Start.innerHTML='
开始研究;
这个。暂停();
}
窗口。导航器。振动(300);
归还这个;
}
};
var pomodoroInstance=新的pomodoro();
clickStart.addEventListener('click',函数(){
pomotoroinstance.toogleState();
});
顺便说一句,有一个问题,你不能手动停止计时器,所以如果用户想设置不同的时间,他将不得不重新加载页面