当前位置: 首页 > 知识库问答 >
问题:

javascript:dblclick不会清除间隔

淳于功
2023-03-14
                                  // sets loop to zero 
                var totalTenths = 0;
                var interval;
                var startButton = document.querySelector('#start');

                // start and pause button 
                document.querySelector('#start').addEventListener('click', function (e) {
                    var startButton = e.target;

                    if (startButton.innerHTML === 'Start') {
                        startButton.innerHTML = 'Pause';
                        interval = setInterval(countTimer, 10)
                        colorInterval = setInterval(colorTimer, 1000) 
                    }
                    else if (e.target.innerHTML === 'Pause') {
                        startButton.innerHTML = 'Resume';
                        clearInterval(interval);
                        clearInterval(colorInterval);
                        // here I'm setting the 15 second restart interval
                        waitedTooLong = setInterval(timeout, 15000)
                    }
                    else if (startButton.innerHTML === 'Resume') {
                        startButton.innerHTML = 'Pause';
                        interval = setInterval(countTimer, 10)
                        colorInterval = setInterval(colorTimer, 1000)
                    }
                });

                // double click to clear function 
                document.querySelector('#start').addEventListener('dblclick', function(e) {
                    var startButton = e.target;
                    if (startButton.innerHTML === 'Resume') {
                        clearInterval(function() {
                            setInterval(countTimer, 10)
                        });
                        document.getElementById('tenths').innerHTML = '00';
                        document.getElementById('seconds').innerHTML = '00';
                        document.getElementById('minutes').innerHTML = '00';
                        document.getElementById('start').innerHTML = 'Start'
                    }
                });
                // loop that converts 10th of millisec to minute and seconds
                function countTimer() {
                    totalTenths++;
                    var minutes = Math.floor(totalTenths / 6000);
                    var seconds = Math.floor((totalTenths - minutes * 6000) / 100);
                    var tenths = totalTenths - (minutes * 6000 + seconds * 100);

                    // replaces inner html with loop with added zero until double digits accure
                    if (tenths > 0) {
                        document.getElementById('tenths').innerHTML = '0' + tenths;
                    }
                    if (tenths > 9) {
                        document.getElementById('tenths').innerHTML = tenths;
                    }
                    if (tenths > 9) {
                        document.getElementById('seconds').innerHTML = '0' + seconds;
                    }
                    if (seconds > 9) {
                        document.getElementById('seconds').innerHTML = seconds;
                    }
                    if (tenths > 0) {
                        document.getElementById('minutes').innerHTML = '0' + minutes;
                        }
                    if (minutes > 9) {
                        document.getElementById('minutes').innerHTML = minutes;
                    }
                }
                
               <div class="text-center container">
                    <button id="start" class="btn btn-large btn-success">Start</button> 
                    <p class="clear-msg">double click to clear!</p>

                    <div id="timer" class="well">
                        <span id="minutes">00</span>:<span id="seconds">00</span>:<span id="tenths">00</span>
                    </div>
                </div>

我有一个名为Interval的setInterval,它运行一个倒计时计时器。我有一个开始按钮,第一次点击时播放,第二次暂停就好了。当我双击时,它会将计时器显示回零,但似乎并没有清除实际的计时器。将只播放在显示被0替换之前停止的地方。

共有2个答案

闻人修平
2023-03-14

我没有发表评论的特权,所以这里是这样。这不是一个完整的答案,我讨厌通过应用程序工作。

从我搜索到的情况来看,我知道,点击会在双击之前触发。你可以尝试一种不同的方式,甚至像长按或其他方式。或者你可以试试这个方法,

如何在元素上同时使用onclick和ondblick?

你要做的是处理点击之间的超时,并决定它是双倍还是单倍。我想应该可以了。

当我能到达我的公司时,我会试着邮寄代码。有一个伟大的一天。

江子石
2023-03-14

您的主要问题是全局totalTenths变量,双击后该变量没有被重置。您也没有在超时或双击后清除colorInterval计时器。正确地终止这两个计时器,重置变量并重新初始化显示可以解决问题。

接下来,组织您的声明在这里会有很大的帮助。与其一遍又一遍地扫描文档中的相同元素,不如将对它们的引用缓存在变量中。

另外,您的colorTimer函数是不必要的,因为它所做的只是包装changeColor函数。

最后,对于多个计时器来说,在启动另一个再次调用相同函数的计时器之前,始终停止任何当前正在运行的计时器是至关重要的。您需要在“click”事件处理程序的if语句的最后一个分支中清除两个计时器。

你有很多重复的代码,这使得阅读和调试更加困难。编码时遵循干燥(不要重复)原则。如果你发现自己输入了两次相同的代码,你可能是做错了什么。下面是一个更简洁、更清晰的工作版本,其中内嵌了注释以解释:

// sets loop to zero 

// This is the varible that essentially hold the elapsed time. It's global so it must be 
// reset upon a timeout or a double-click
var totalTenths = 0;

// Always initialize your variables to something, use null if you don't 
// have an actual value yet.
var interval = null;
var colorInterval = null;
var waitedTooLong = null;

// Get DOM references just once and then use them throughout the rest of the code
var startButton = document.getElementById('start');
var m = document.getElementById('minutes');
var s = document.getElementById('seconds');
var t = document.getElementById('tenths');

// start and pause button 
startButton.addEventListener('click', function (e) {
  // No need to test what object you're dealing with
  // you are here because the start button got clicked
  // that makes "this" === startButton

  // Don't use .innerHTML when you are only working with raw text
  // use textContent instead.
  if (this.textContent === 'Start') {
    startButton.textContent = 'Pause';
    interval = setInterval(countTimer, 10)
    colorInterval = setInterval(changeColor, 1000) 
  } else if (this.textContent === 'Pause') {
    startButton.textContent = 'Resume';
    clearInterval(interval);
    clearInterval(colorInterval);
    
    // here I'm setting the 15 second restart interval
    waitedTooLong = setInterval(timeout, 15000)
  } else {
    // Clear prior timers
    clearInterval(interval);
    clearInterval(colorInterval);
    
    this.textContent = 'Pause';
    interval = setInterval(countTimer, 10)
    colorInterval = setInterval(changeColor, 1000)
  }
});

// double click to clear function which is the same as the timeout function
startButton.addEventListener('dblclick', timeout);

// changes second's color
function changeColor() {
  var red = Math.round(Math.random() * 255);
  var green = Math.round(Math.random() * 255);
  var blue = Math.round(Math.random() * 255);
  
  s.style.color = 'rgb(' + red + ', ' + green + ', ' + blue + ')';
}

// loop that converts 10th of millisec to minute and seconds
function countTimer() {
  totalTenths++;
  var minutes = Math.floor(totalTenths / 6000);
  var seconds = Math.floor((totalTenths - minutes * 6000) / 100);
  var tenths = totalTenths - (minutes * 6000 + seconds * 100);

  // replaces inner html with loop with added zero until double digits accure
  if (tenths > 0) { t.textContent = '0' + tenths; }
  if (tenths > 9) { t.textContent = tenths; }
  if (tenths > 9) { s.textContent = '0' + seconds;  }
  if (seconds > 9) { s.textContent = seconds; }
  if (tenths > 0) { m.textContent = '0' + minutes; }
  if (minutes > 9) { m.textContent = minutes; }
}

// 15 second restart funciton
function timeout() {
  clearInterval(interval);
  clearInterval(colorInterval);
  
  t.textContent = '00';
  s.textContent = '00';
  m.textContent = '00';
  startButton.textContent = 'Start'
  s.style.color = "#000";
  
  // You must reset this global variable for the counter to reset properly
  totalTenths = 0;  //  <<------------------------ 
}
<script type="text/javascript" src="https://cdn.polyfill.io/v2/polyfill.min.js?features=es6,fetch,Array.prototype.includes"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<div class="text-center container">
  <button id="start" class="btn btn-large btn-success">Start</button> 
  <p class="clear-msg">double click to clear!</p>
  <div id="timer" class="well">
    <span id="minutes">00</span>:
    <span id="seconds">00</span>:
    <span id="tenths">00</span>
  </div>
</div>
 类似资料:
  • 问题内容: 我在body 函数上使用此脚本: 每次我移动鼠标并画一条新线时,都应该清除画布,但是它不能正常工作。我正在尝试不使用jQuery,鼠标侦听器或类似工具来解决它。 问题答案: 您应该使用“ beginPath() ”。这就对了。

  • 好吧,这是一个奇怪的,我甚至不认为是可能的。 所以,自从我使用Nexus5X以来,当我卸载应用程序时,SharedPreferences就不会被删除。 我通过Android Studio安装了这个应用程序并进行了测试。然后我卸载应用程序。然后我通过Android Studio重新发布了这个应用程序,所有的SharedPreferences值仍然存在。 知道是什么引起的吗?

  • 问题内容: 我用Java编写selenium脚本已有一段时间了。我今天遇到了一个很奇怪的问题。 这是问题所在:我使用webelement.clear()方法清除了文本字段,稍后在执行下一个命令(单击事件)时,先前清除的文本区域现在填充有先前填充的值。 这是代码片段: 问题答案: 面临类似的问题。输入字段被清除,但错误消息未更新。似乎只有在输入和删除字符后,某些输入字段才能正常工作:

  • 项目类别: 主屏幕类别: 日志:第一次单击开始时:(计时器完成后) 单击调试按钮后(清除数组列表): 再次点击开始按钮后:(计时器完成后) 您可以看到ArrayList中的项目没有被清除。它增加了。我认为这是因为在spawnItem()中创建的Item实例仍然存在。我该如何解决这个问题? 我注意到每次我点击按钮都没有更多的项目。项目产生得更快。但是如何阻止这种情况呢?

  • 我有一个如下定义的表视图 当用户单击时,我使用单击的项目详细信息重新加载表。在我重新加载之前,我对表项调用清除 现在,当我单击另一个项目并尝试重新加载表格时,它看起来像下面这样。这是非常奇怪的,因为应该只有一行,但行的大小是一样的,就像从以前的点击,其余的行是空的,除了图标。当我点击图标时,没有任何反应。任何人以前都面临过这种情况。有人知道这是什么原因吗? 我的工具定义如下。它们只是2 的

  • 问题内容: 在导入flask时,我们导入模块等。 是一种字典,可以使用会话进行访问。 现在,我尝试清除尝试构建网站时使用的所有垃圾变量。 关于stackoverflow的答案之一使用了类似清除会话内容的命令。但是,这样的命令会产生错误,表明不存在这样的命令。 谁能为我指出每次关闭服务器或关闭网站时如何清除和如何清除会话? 问题答案: 我将这样的会话与flask一起使用,它确实起作用。我虽然不使用,