use*_*622 12 javascript time intervals
我有一个托管仪表板的网站:我可以在页面上编辑JavaScript,而且我现在每隔五秒刷新一次.
我现在想要在window.print()每天上午8点开始运行.
我怎么能这样做?
Ast*_*oCB 38
JavaScript 不是这个的工具.如果你想在每天的特定时间运行某些东西,你几乎肯定会在寻找本地运行的东西,比如python或applescript.
但是,我们暂时考虑JavaScript是您唯一的选择.有几种方法可以做到这一点,但我会给你最简单的方法.
首先,您必须创建一个new Date()并设置一个检查间隔,以查看小时是否为8(上午8点).
这将检查每分钟(60000毫秒),看看它是否是8点钟:
window.setInterval(function(){ // Set interval for checking
var date = new Date(); // Create a Date object to find out what time it is
if(date.getHours() === 8 && date.getMinutes() === 0){ // Check the time
// Do stuff
}
}, 60000); // Repeat every 60000 milliseconds (1 minute)
Run Code Online (Sandbox Code Playgroud)
它不会在执行准确,因为它是检查8点(除非你开始运行在这一分钟右)每分钟一次.您可以尽可能地减少间隔,以增加检查的准确性,但这样做有点过分:它会检查每天每小时的每一分钟,看是否是8点钟.
检查的强度取决于JavaScript的性质:有更好的语言和框架用于此类事情.因为JavaScript在加载时会在网页上运行,所以它并不意味着可以处理持久的扩展任务.
还要意识到这需要打开正在执行的网页.也就是说,如果页面未打开进行计数并每分钟检查一次,则无法在每天上午8点进行预定的操作.
你说你已经每五秒刷新一次页面:如果这是真的,你根本就不需要计时器.每次刷新页面时都要检查:
var date = new Date(); // Create Date object for a reference point
if(date.getHours() === 8 && date.getMinutes() === 0 && date.getSeconds() < 10){ // Check the time like above
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
有了这个,您还必须检查秒数,因为您每五秒钟刷新一次,因此您将获得重复的任务.
随着中说,你可能想要做像这样在OS X计划任务或撰写的Automator工作流
如果你需要更多与平台无关的东西,我会认真考虑看看Python或Bash.
作为一个更新,自动化JavaScript是在OS X Yosemite中引入的,它似乎提供了一种可行的方式来使用JavaScript来做这类事情(虽然显然你没有在同一个环境中使用它; Apple只是给你一个在本地使用另一种脚本语言的界面).
如果您使用的是OS X并且真的想使用JavaScript,我认为这是可行的方法.
与上述相关的发布说明似乎是撰写本文时的唯一现有文件(约塞米特向公众发布后约2个月),但它们值得一读.您还可以查看javascript-automation标签以获取一些示例.
我还发现JXA Cookbook 非常有帮助.
您可能需要稍微调整一下这种方法以根据您的具体情况进行调整,但我将概述一下.


写JavaScript.
在继续操作之前,您必须知道自己想要做什么.根据您提供的内容,我假设您要window.print()在Safari中加载的页面上执行.你可以这样做(或者更常见的是,在Safari选项卡中执行任意JS):
var safari = Application('Safari');
safari.doJavaScript('window.print();', { in: safari.windows[0].currentTab });
Run Code Online (Sandbox Code Playgroud)windows根据您的设置调整您正在访问的内容.File -> Save或⌘+ S)为您可以找到的位置(或iCloud)中的应用程序.
而已!每次将该事件设置为运行时,您在应用程序文件中编写的JavaScript代码都将运行.您应该能够在Automator中返回到您的文件,并在需要时修改代码.
function every8am (yourcode) {
var now = new Date(),
start,
wait;
if (now.getHours() < 7) {
start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 0, 0, 0);
} else {
start = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 8, 0, 0, 0);
}
wait = start.getTime() - now.getTime();
if(wait <= 0) { //If missed 8am before going into the setTimeout
console.log('Oops, missed the hour');
every8am(yourcode); //Retry
} else {
setTimeout(function () { //Wait 8am
setInterval(function () {
yourcode();
}, 86400000); //Every day
},wait);
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它:
var yourcode = function () {
console.log('This will print evryday at 8am');
};
every8am(yourcode);
Run Code Online (Sandbox Code Playgroud)
基本上,获取现在的时间戳,今天上午8点的时间戳,如果及时运行,或者明天早上8点,然后设置一个24小时的间隔来每天运行代码.您可以通过在不同的时间戳设置变量start来轻松更改运行的小时数.
我不知道如何做到这一点,正如其他人指出的那样,你需要整天打开页面才能看到发生这种情况......
此外,由于您每5秒刷新一次:
function at8am (yourcode) {
var now = new Date(),
start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 0, 0, 0);
if (now.getTime() >= start.getTime() - 2500 && now.getTime() < start.getTime() + 2500) {
yourcode();
}
}
Run Code Online (Sandbox Code Playgroud)
以与每个上午8点相同的方式运行它,它看起来是早上8点还是后面2.5秒,如果确实如此则运行.