倒计时定时器Javascript在线代码外部脚本

时间:2018-03-22 02:47:14

标签: javascript html css

我在网上找到了这段代码Countdown Timer

并尝试在页面上实现它,但它没有倒计时。感谢所有评论的人。这是NOW WORKING示例代码(见下面的代码段)

    function getTimeRemaining(endtime) {
      var t = Date.parse(endtime) - Date.parse(new Date());
      var seconds = Math.floor((t / 1000) % 60);
      var minutes = Math.floor((t / 1000 / 60) % 60);
      var hours = Math.floor((t / (1000 * 60 * 60)) % 24);
      var days = Math.floor(t / (1000 * 60 * 60 * 24));
      return {
        'total': t,
        'days': days,
        'hours': hours,
        'minutes': minutes,
        'seconds': seconds
      };
    }
    
    function initializeClock(id, endtime) {
      var clock = document.getElementById(id);
      var daysSpan = clock.querySelector('.days');
      var hoursSpan = clock.querySelector('.hours');
      var minutesSpan = clock.querySelector('.minutes');
      var secondsSpan = clock.querySelector('.seconds');
    
      function updateClock() {
        var t = getTimeRemaining(endtime);
    
        daysSpan.innerHTML = t.days;
        hoursSpan.innerHTML = ('0' + t.hours).slice(-2);
        minutesSpan.innerHTML = ('0' + t.minutes).slice(-2);
        secondsSpan.innerHTML = ('0' + t.seconds).slice(-2);
    
        if (t.total <= 0) {
          clearInterval(timeinterval);
        }
      }
    
      updateClock();
      var timeinterval = setInterval(updateClock, 1000);
    }
    
    var deadline = new Date(Date.parse(new Date()) + 15 * 24 * 60 * 60 * 1000);
    initializeClock('clockdiv', deadline);
    
    
    #clockdiv{
    	font-family: sans-serif;
    	color: #fff;
    	display: inline-block;
    	font-weight: 100;
    	text-align: center;
    	font-size: 30px;
    }
    
    #clockdiv > div{
    	padding: 10px;
    	border-radius: 3px;
    	background: #00BF96;
    	display: inline-block;
    }
    
    #clockdiv div > span{
    	padding: 15px;
    	border-radius: 3px;
    	background: #00816A;
    	display: inline-block;
    }
    
    .smalltext{
    	padding-top: 5px;
    	font-size: 16px;
    }
    
    
    <div id="clockdiv" align='center'>
      <div>
        <span class="days"></span>
        <div class="smalltext">Days</div>
      </div>
      <div>
        <span class="hours"></span>
        <div class="smalltext">Hours</div>
      </div>
      <div>
        <span class="minutes"></span>
        <div class="smalltext">Minutes</div>
      </div>
      <div>
        <span class="seconds"></span>
        <div class="smalltext">Seconds</div>
      </div>
    </div>

也许它需要做一个正文载入或者我错过了一些东西,因为当我尝试代码时它只显示空框而没有计时器。

虽然有许多很棒的时钟插件,但正如文章所说,在原始javascipt中执行此操作是有意义的:

代码将是轻量级的,因为它将没有外部脚本

网站的效果会更好,因为您无需加载外部脚本和样式表。

有更多的控制权,因为你将构建时钟以完全按照你想要的方式运行(而不是试图根据你的意愿弯曲插件)。

如果可以使用最少的更改工作,它似乎是一段有用的代码。我错过了什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果clock为null,则选择器#clockdiv失败。在脚本运行时尚未填充DOM:将脚本移动到正文的底部,以便在脚本运行之前存在正文(包括#clockdiv),或者将脚本保存在自己的脚本中.js文件并为其提供defer属性,或将整个脚本包装在DOMContentLoaded侦听器中(因此它等待在运行之前解析文档)。

答案 1 :(得分:1)

就像@Certain Performance所说的那样,你是在创建元素之前尝试运行你的JS。最干净的解决方案是将JS移动到它自己的文件中并将其包含在body标签的底部。

function getTimeRemaining(endtime) {
  var t = Date.parse(endtime) - Date.parse(new Date());
  var seconds = Math.floor((t / 1000) % 60);
  var minutes = Math.floor((t / 1000 / 60) % 60);
  var hours = Math.floor((t / (1000 * 60 * 60)) % 24);
  var days = Math.floor(t / (1000 * 60 * 60 * 24));
  return {
    'total': t,
    'days': days,
    'hours': hours,
    'minutes': minutes,
    'seconds': seconds
  };
}

function initializeClock(id, endtime) {
  var clock = document.getElementById(id);
  var daysSpan = clock.querySelector('.days');
  var hoursSpan = clock.querySelector('.hours');
  var minutesSpan = clock.querySelector('.minutes');
  var secondsSpan = clock.querySelector('.seconds');

  function updateClock() {
    var t = getTimeRemaining(endtime);

    daysSpan.innerHTML = t.days;
    hoursSpan.innerHTML = ('0' + t.hours).slice(-2);
    minutesSpan.innerHTML = ('0' + t.minutes).slice(-2);
    secondsSpan.innerHTML = ('0' + t.seconds).slice(-2);

    if (t.total <= 0) {
      clearInterval(timeinterval);
    }
  }

  updateClock();
  var timeinterval = setInterval(updateClock, 1000);
}

var deadline = new Date(Date.parse(new Date()) + 15 * 24 * 60 * 60 * 1000);
initializeClock('clockdiv', deadline);
body {
  text-align: center;
}

#clockdiv {
  font-family: sans-serif;
  color: #fff;
  display: inline-block;
  font-weight: 100;
  text-align: center;
  font-size: 30px;
  margin: auto;
}

#clockdiv>div {
  padding: 10px;
  border-radius: 3px;
  background: #00BF96;
  display: inline-block;
}

#clockdiv div>span {
  padding: 15px;
  border-radius: 3px;
  background: #00816A;
  display: inline-block;
}

.smalltext {
  padding-top: 5px;
  font-size: 16px;
}
<!doctype html>
<html class="no-js" lang="">

<head>
  <meta charset="utf-8">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  <title>Countdown timer</title>
</head>

<body>
  <!--[if lte IE 9]>
            <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="https://browsehappy.com/">upgrade your browser</a> to improve your experience and security.</p>
        <![endif]-->

  <h1>Stack Overflow Countdown timer.</h1>

  <div id="clockdiv" align='center'>
    <div>
      <span class="days"></span>
      <div class="smalltext">Days</div>
    </div>
    <div>
      <span class="hours"></span>
      <div class="smalltext">Hours</div>
    </div>
    <div>
      <span class="minutes"></span>
      <div class="smalltext">Minutes</div>
    </div>
    <div>
      <span class="seconds"></span>
      <div class="smalltext">Seconds</div>
    </div>
  </div>

  <!-- Run at the end of the page -->
  <script src="js/main.js"></script>

</body>

</html>

答案 2 :(得分:1)

这是因为您在创建DOM对象之前尝试使用document.getElementById函数获取DOM元素。 您可以在代码底部移动脚本代码,也可以在DOMContentLoaded或body load或document load或window load事件函数中调用initializeClock函数。