使用Javascript我希望能够在特定时间运行特定任务

时间:2016-02-11 21:44:21

标签: javascript

我知道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的链接。

5 个答案:

答案 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;对我来说。

更新 - 一些注释,如其他答案所述:

  • 使用&#39; ===&#39;也是一个问题,hr / mn是字符串,所以你需要&#39; ==&#39;或将hr / mn转换为整数
  • strthour.valuesetTime之类的表达式适用于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)

您的代码存在一些问题,各种人都指出了这些问题。

  1. Walker Randolph Smith正确地指出,date.GetHours()date.getMinutes()都会返回数字,而strthour.valuestrtmin.value返回的值将是字符串。当JavaScript比较这两者时,它将始终评估为false。要解决此问题,请尝试通过parseInt运行用户输入,如hr = parseInt(strthour.value, 10);中所示。 10很重要,因为它告诉parseInt创建一些基数10(你不需要知道这意味着什么,只要确保包括10)。

  2. 您需要匹配的秒数可能是不必要的,并且与您选择的时间间隔不匹配。 TheMintyMate通过简单地删除秒的比较,在其代码片段中进行了此更正。如果你真的需要确保秒完美匹配,选择一个小于1000毫秒的间隔,所以你知道它将每秒至少检查一次,保证你将在所需的第0秒运行检查时间。

  3. 如果您尝试将它们作为字符串进行比较,而不是按照第1点中的建议转换为数字,则可能会遇到单位数分钟的问题。.getMinutes()方法将返回单个数字{{ 1}}一段时间,如6:00,而您的示例隐式提示用户输入同一时间的两位数字。同样,您可以完全通过使用第1点中建议的parseInt来避免此问题。

  4. 我必须插入一个插件,用于使用Cron作业来按照这样的已知计划运行任务。我知道你说用户在这种情况下要求JS,所以他们可能不适用于这种特定情况。既然你没有提到Cron的工作,我必须把它们包含在这里,以确保你和未来的读者都知道它们,因为它们是针对这种在自动计划中运行任务的情况而设计的。

    祝你好运!

答案 4 :(得分:-1)

我认为你应该使用“&gt; =”运算符,因为你不知道它是否会在那个时候完全。