【问题标题】:Sunrise Alarm Clock - Website日出闹钟 - 网站
【发布时间】:2017-11-12 15:32:04
【问题描述】:

我的朋友有一个“日出闹钟”,当该醒来时它会变得更亮,以模拟日出以方便起床。

我以为我可以用我的笔记本电脑做同样的事情,但是我一直在努力让 Javascript 有时间工作。我将不胜感激任何帮助让这件事发挥作用。

我一直在尝试添加分钟值 (wakeupM),无论我想睡多久,这都会延迟 setTimeout 函数并且仅在我要醒来时运行。不过,我希望能够在时间输入框中设置时间,并让“日出”功能仅在到达该时间时运行。

提前感谢您的帮助!

var countTime;

function mySleep() {
  var now = new Date();
  var nowM = now.getMinutes();


  var wakeup = new Date();
  var wakeupM = wakeup.getMinutes() + 3;


  var timeDif = wakeupM - nowM;
  countTime = 6000 * timeDif;


  document.getElementById("settime").innerHTML = countTime;

}

function mySunrise() {
  var colors = ['orange', 'yellow', 'white'];
  var active = 0;


  setInterval(function() {
    document.querySelector('body').style.background = colors[active];
    active++;
    if (active == colors.length) active = 0;
  }, 3000);;
}
body {
  background: green;
  /* initial color */
  transition: background 5s;
  /* .5s how long transition should take */
}
<input type="time" id="myTime" value="22:15:00">
<button onclick="setTimeout(mySunrise, countTime); mySleep();">Wake me up</button>
<h1>waking you up at:</h1>
<p id="settime"></p>

【问题讨论】:

  • 您的countTime 变量在初始化之前使用..
  • @ammarx 如何在 mySleep 运行后调用 countTime 变量但仍将其包含在 setTimeout 函数中?
  • 你应该在使用之前计算countTime。也许您应该在 sleep 函数之外通过添加一个事件侦听器来执行此操作,该事件侦听器在每次输入字段更改时计算countTime。此外,您在 sleep 函数中对countTime 的计算不是基于用户使用输入字段设置的值。
  • @ammarx 我将 onclick 的顺序反转为 "mySleep(); setTimeout(mySunrise, countTime); 现在延迟部分起作用了 - 我正在努力使用输入框,因为我不知道如何将框中的小时和分钟转换为时间戳,以允许 mySleep 函数计算延迟工作的毫秒差

标签: javascript html css web


【解决方案1】:

我的个人网站上的完成版 - http://piotrirving.com/alarm/sunrise.html

var wakeupH;
var wakeupM;
var wakeupS;

var nowH;
var nowM;
var nowS;


function mySleep() {
  var wakeUpTime = document.getElementById("myTime");
  var currentVal = wakeUpTime.value;
  var res = currentVal.split(":");

  wakeupH = res[0]
  wakeupM = res[1]
  wakeupS = res[2]

  var now = new Date();
  var nowH = now.getHours();
  var nowM = now.getMinutes();
  var nowS = now.getSeconds();

  var date1 = new Date(2000, 0, 1, nowH, nowM, nowS);

  var date2 = new Date(2000, 0, 1, wakeupH, wakeupM, 1);


  if (date2 < date1) {
    date2.setDate(date2.getDate() + 1);
  }

  countTime = date2 - date1;
  document.getElementById("settime").innerHTML = countTime;
}



function mySunrise() {
  var colors = ["#BDB76B", "#F0E68C", "#EEE8AA", "#FFDAB9", "#FFE4B5", "#FFA07A", "#FF7F50", "#FF6347", "#FF4500", "#FF8C00", "#FFA500", "#FFEFD5", "#FAFAD2", "#FFFACD", "#FFFFE0", "#FFFF00", "#FFD700", "white"];
  var active = 0;


  setInterval(function() {
    document.querySelector('body').style.background = colors[active];
    active++;
    if (active == colors.length) active = 0;
  }, 3000);;
}
body {
  background: black;
  /* initial color */
  transition: background 30s;
  /* .5s how long transition should take */
  color: white;
}
Time: <input type="time" id="myTime" value="22:53:01">
<button onclick="mySleep(); setTimeout(mySunrise, countTime);">Wake me up</button>
<p id="settime"></p>

【讨论】:

  • 请注意,如果您想宣传自己的产品/博客,您必须披露您的隶属关系,否则您的回答可能会被标记为垃圾邮件。请阅读How to not be a spammer
  • @DavidPostill,感谢您的提醒,我补充说这是我个人网站的链接 - 我只是想展示最终产品
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多