我知道javascript不是最好的方法。我知道我必须启动浏览器并始终运行。我通常会用Python做点什么。这是我的具体要求,我对javascript不是很熟练。话虽如此。
我希望用户能够使用输入设置时间。一旦设置了这些输入,我希望浏览器检查指定的时间。一旦时间发生,我希望它执行一个命令。
到目前为止,她就是我所拥有的:
<html>
<body>
<p>Enter Time to start dashboard</p>
<p>Hour</p>
<input id="strthour">
<p>Minute</p>
<input id="strtmin">
<button onclick="setTime()">Submit</button>
<script>
var hr = 06; //default time of 6am to run
var mn = 00;
function setTime() {
hr = strthour.value;
mn = strtmin.value;
}
window.setInterval(function(){ // Set interval for checking
alert(hr+mn);
var date = new Date(); // Create a Date object to find out what time it is
if(date.getHours() === hr && date.getMinutes() === mn && date.getSeconds() === 0){ // Check the time
alert("it worked")
}
}, 5000); // Repeat every 60000 milliseconds (1 minute)
</script>
</body>
</html>
我能够更改全局变量,但是我无法获得window.setInterval来识别更改。有什么建议吗?
以下是我制作的JSFiddle的链接。
答案 0 :(得分:1)
这不是因为setInterval
没有识别出这种变化,实际上你并没有修改这些价值。
如果您在jsfiddle页面上打开javascript控制台,您将看到&#34; Uncaught ReferenceError:未定义setTime&#34;。
如果您像这样定义setTime
,它将起作用:
window.setTime = function() {
hr = strthour.value;
mn = strtmin.value;
}
这是因为JSFiddle没有直接运行你的代码,而是包含在
中<script type='text/javascript'>//<![CDATA[
window.onload=function(){
... // you code here }
}//]]>
这是一个modified JSFiddle只是&#34;它起作用了#34;对我来说。
更新 - 一些注释,如其他答案所述:
strthour.value
中setTime
之类的表达式适用于JSFiddle。我不确定为什么,但它确实有效。在&#34;现实世界&#34;它应该像document.getElementById("strthour").value
更新2 - 为什么strthour.value
有效(vs document.getElementById("strthour").value
)?
这对我来说实际上是一个惊喜,但看起来所有主流浏览器都将id
的所有元素放入窗口对象中。更重要的是,它实际上是HTML standard的一部分(尽管不建议使用此功能):
6.2.4 Window对象的命名访问
窗口[名称] 返回指定的元素或元素集合。
作为一般规则,依赖于此将导致代码脆弱。例如,随着新功能添加到Web平台,哪些ID最终映射到此API可能会随着时间的推移而变化。而不是这个,使用document.getElementById()或document.querySelector()。
参考文献:
答案 1 :(得分:1)
if(date.getHours() === hr && date.getMinutes() === mn && date.getSeconds() === 0){ // Check the time
alert("it worked")
}
这会将字符串与int进行比较,并始终为false。
执行parseInt(date.getHours())
或使用==
答案 2 :(得分:1)
您没有正确引用输入,并且警报也存在语法错误。以下是我建议的修复(工作):
<p>Enter Time to start dashboard</p>
<p>Hour</p>
<input id="strthour">
<p>Minute</p>
<input id="strtmin">
<button onclick="setTime()">Submit</button>
<script>
var hr = 0;
var mn = 0;
function setTime() {
hr = parseInt(document.getElementById("strthour").value);
mn = parseInt(document.getElementById("strtmin").value);
console.log("set time: "+hr+":"+mn);
}
setInterval(function(){
var date = new Date();
if(date.getHours() == hr && date.getMinutes() == mn){ // using == not ===
alert("it worked");
}
}, 10000);
</script>
注意:您还应该对值进行parseInt()以确保它们是有效数字。
答案 3 :(得分:1)
您的代码存在一些问题,各种人都指出了这些问题。
Walker Randolph Smith正确地指出,date.GetHours()
和date.getMinutes()
都会返回数字,而strthour.value
和strtmin.value
返回的值将是字符串。当JavaScript比较这两者时,它将始终评估为false
。要解决此问题,请尝试通过parseInt运行用户输入,如hr = parseInt(strthour.value, 10);
中所示。 10很重要,因为它告诉parseInt创建一些基数10(你不需要知道这意味着什么,只要确保包括10)。
您需要匹配的秒数可能是不必要的,并且与您选择的时间间隔不匹配。 TheMintyMate通过简单地删除秒的比较,在其代码片段中进行了此更正。如果你真的需要确保秒完美匹配,选择一个小于1000毫秒的间隔,所以你知道它将每秒至少检查一次,保证你将在所需的第0秒运行检查时间。
如果您尝试将它们作为字符串进行比较,而不是按照第1点中的建议转换为数字,则可能会遇到单位数分钟的问题。.getMinutes()
方法将返回单个数字{{ 1}}一段时间,如6:00,而您的示例隐式提示用户输入同一时间的两位数字。同样,您可以完全通过使用第1点中建议的parseInt来避免此问题。
我必须插入一个插件,用于使用Cron作业来按照这样的已知计划运行任务。我知道你说用户在这种情况下要求JS,所以他们可能不适用于这种特定情况。既然你没有提到Cron的工作,我必须把它们包含在这里,以确保你和未来的读者都知道它们,因为它们是针对这种在自动计划中运行任务的情况而设计的。
祝你好运!答案 4 :(得分:-1)
我认为你应该使用“&gt; =”运算符,因为你不知道它是否会在那个时候完全。