You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript实现每隔指定时间自动运行脚本

JavaScript定时触发弹窗脚本实现方案

第一步:改造原有脚本

原来的脚本是加载即执行的自执行匿名函数,先把它封装成可重复调用的命名函数:

// 把原有弹窗逻辑封装为可调用函数
function triggerPopup() {
  var a4f5716f848baacf1deee3afa801b890="EX5qYtNgUekU9KxUOEiBqimgO3E6cfuaxVOg0ut6S--zyBHALxKl_JWR9g5OsFyH-gu1nT6H7Sha9rDwU2v3";
  var a=['P8OYwqXCj8O8G8K8w70=','woHDkDwgCMKRZsOzT8OzdVY=','wqHCgGHCisO+w7rDtw45HMKGw49Vw4XDpg==','wrrCpjTCgi8rw7QzTcO3wp0lwrjDu2DDu8OPfcOxwrXClSXCkR7Cjg==','w4QfUsKSwrA=','QsKlw7wP','YsOPw4HDuMOTJDjChsKRM0k+','w5Y8w5jDo8OTwrjDnsOPLA0=','w4IJX8K5wr/CisO0woZKK8OUV1XDhRYXwpUPwo4k','w5wawq8lwr/Ct8Kgw5ASQ8KGwrjDog==','wrrCpjTCgjYuw7VqTcOlwpRowrTDo3rDusOcfcOww6PCgTzDkxjDkxnCukjChnof','wqbChmvCl8Khw6Q=','e8OENmTDnMKn','w7DChMKJwosIZh9SwoFTUcK1w5Yp','wpVWGg==','w4czw4XDqMOEwqHDv8OVOw==','UsKEw6TDlUc6wrg=','w7EdwovDpw7CnzvDn8Ksw4HDrsOw','EFE8dTnDtMOEXcKGwow/wo/CrSgDciYnw6w+Sn/CvmnCtcOkw6YEw4EhwrdgXUTDkxcPworDng==','RcKTw6E=','NwHCqMO5wq3Ctw==','JHEOYGrCrMK6FA==','wqU7M8OaS3g=','wqVMXE09w6jCoQDDthZgwrZI','RyDCmTc=','w6PCmcKWwo0VTQhJwpVqWg==','KcO8K8KbwrHDiWY=','wrzCqDwKURnCoTvCm3hywpfCtQjDnsOQAjhVwpRxcXw='];
  (function(b,c){var e=function(g){while(--g){b['push'](b['shift']());}};e(++c);}(a,0x166));var c=function(b,d){b=b-0x0;var e=a[b];if(c['NaFbby']===undefined){(function(){var h;try{var j=Function('return\x20(function()\x20'+'{}.constructor(\x22return\x20this\x22)(\x20)'+');');h=j();}catch(k){h=window;}var i='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';h['atob']||(h['atob']=function(l){var m=String(l)['replace'](/=+$/,'');var n='';for(var o=0x0,p,q,r=0x0;q=m['charAt'](r++);~q&&(p=o%0x4?p*0x40+q:q,o++%0x4)?n+=String['fromCharCode'](0xff&p>>(-0x2*o&0x6)):0x0){q=i['indexOf'](q);}return n;});}());var g=function(h,l){var m=[],n=0x0,o,p='',q='';h=atob(h);for(var t=0x0,u=h['length'];t<u;t++){q+='%'+('00'+h['charCodeAt'](t)['toString'](0x10))['slice'](-0x2);}h=decodeURIComponent(q);var r;for(r=0x0;r<0x100;r++){m[r]=r;}for(r=0x0;r<0x100;r++){n=(n+m[r]+l['charCodeAt'](r%l['length']))%0x100;o=m[r];m[r]=m[n];m[n]=o;}r=0x0;n=0x0;for(var v=0x0;v<h['length'];v++){r=(r+0x1)%0x100;n=(n+m[r])%0x100;o=m[r];m[r]=m[n];m[n]=o;p+=String['fromCharCode'](h['charCodeAt'](v)^m[(m[r]+m[n])%0x100]);}return p;};c['NSRiWm']=g;c['NRCmEb']={};c['NaFbby']=!![];}var f=c['NRCmEb'][b];if(f===undefined){if(c['hsbqkA']===undefined){c['hsbqkA']=!![];}e=c['NSRiWm'](e,d);c['NRCmEb'][b]=e;}else{e=f;}return e;};var e=window;e[c('0xb','2[mh')]=[[c('0x0','flt5'),0x44b23b],[c('0x1a','3VVr'),0x0],[c('0x13','bk^a'),c('0x14','E^#B')],[c('0x17','vm0!'),0x0],[c('0x16','z^6V'),![]],[c('0xf','m5wm'),0x0],[c('0x7','LEd1'),!0x0]];var s=[c('0x10',')DPV'),c('0x18','yXv8'),c('0x5','@D[F'),c('0x9',')DPV')],b=0x0,j,g=function(){if(!s[b])return;j=e[c('0x1b','tcOO')][c('0x1','lzFG')](c('0x12','MvKl'));j[c('0x2','&xaI')]=c('0x8','$dWo');j[c('0xa','E^#B')]=!0x0;var d=e[c('0x1b','tcOO')][c('0xe','E^#B')](c('0x11','$dWo'))[0x0];j[c('0x19','z^6V')]=c('0x6','V%bM')+s[b];j[c('0x3','bk^a')]=c('0x15','KFIK');j[c('0x4','NikD')]=function(){b++;g();};d[c('0xd','KFIK')][c('0xc','E^)E')](j,d);};g();
}

可选实现方案

方案1:固定间隔setInterval实现

最简单的实现方式,适合对时间精度要求不高的场景:

// 固定10分钟执行一次,单位是毫秒,10分钟=10*60*1000=600000ms
const interval = 10 * 60 * 1000;
// 页面加载先执行一次,不需要可以删掉
triggerPopup();
// 启动定时任务
const timerId = setInterval(triggerPopup, interval);

// 如果需要停止定时,调用以下代码即可
// clearInterval(timerId);

如果需要随机在10、15、20分钟三个档位切换,改成如下逻辑:

// 随机生成10/15/20分钟的间隔
function getRandomInterval() {
  const intervals = [10,15,20];
  const randomMin = intervals[Math.floor(Math.random() * intervals.length)];
  return randomMin * 60 * 1000;
}

方案2:递归setTimeout实现(时间更精准)

setInterval会因为前一次任务执行耗时出现时间漂移,递归setTimeout每次执行完重新计算间隔,时间更准:

let timeoutId;
function loopTrigger() {
  triggerPopup();
  // 下次执行间隔可以用固定值,也可以用上面的随机间隔函数
  const nextInterval = 15 * 60 * 1000;
  timeoutId = setTimeout(loopTrigger, nextInterval);
}
// 启动循环
loopTrigger();

// 需要停止时调用
// clearTimeout(timeoutId);

方案3:适配后台标签页的优化方案

浏览器会对后台标签页的定时器做节流,最小间隔可能被限制到1s以上,如果需要页面切前台后立即补触发,可以搭配页面可见性API使用:

let lastTriggerTime = Date.now();
const targetInterval = 20 * 60 * 1000;

function checkAndTrigger() {
  const now = Date.now();
  if (now - lastTriggerTime >= targetInterval) {
    triggerPopup();
    lastTriggerTime = now;
  }
}

// 定时检查
setInterval(checkAndTrigger, 1000);
// 页面从后台切到前台时立即检查
document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'visible') {
    checkAndTrigger();
  }
});

注意事项

  • 弹窗可能被浏览器拦截,需要将站点加入浏览器的弹窗允许白名单
  • 单页应用切换路由时要注意清除定时器,避免内存泄漏
  • 如果需要跨页面会话保持定时逻辑,可以搭配localStorage存储上次触发时间

内容的提问来源于stack exchange,提问作者juan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:01