JavaScript—是否可以修改第三方脚本(外部托管)使用的setInterval/setTimeout的行为

JavaScript—是否可以修改第三方脚本(外部托管)使用的setInterval/setTimeout的行为,javascript,timer,setinterval,Javascript,Timer,Setinterval,我有一个第三方工具,在CDN上托管他们的JavaScript,我不想实现自定义版本脚本,因为他们进行了大量的更改和快速开发。部分JavaScript使用8分钟的计时器执行setInterval 我想知道是否有可能访问计时器堆栈,并将所有后续计时器事件的8分钟修改为100秒 如果不是,建议的替代方法是使用我自己的自定义js重新写入/覆盖setInterval函数,并确保我的自定义js首先加载在所有其他js之前,然后使用匹配的If条件修改超时,如果8分钟更改为100秒?我的假设是这样的: windo

我有一个第三方工具,在CDN上托管他们的JavaScript,我不想实现自定义版本脚本,因为他们进行了大量的更改和快速开发。部分JavaScript使用8分钟的计时器执行setInterval

我想知道是否有可能访问计时器堆栈,并将所有后续计时器事件的8分钟修改为100秒

如果不是,建议的替代方法是使用我自己的自定义js重新写入/覆盖setInterval函数,并确保我的自定义js首先加载在所有其他js之前,然后使用匹配的If条件修改超时,如果8分钟更改为100秒?我的假设是这样的:

window.setInterval = function(callback, timeout) {
//check timeout for 8 minutes
}

好吧,我会不惜一切代价避免这种情况(除了尝试“为了好玩”)

这里可能是结果(setInterval,其中所有大于等于100秒的间隔都被100秒替换)


我试图以最连贯的方式进行黑客攻击,window.setIntervalOld可用于您自己的代码。告诉我它为您做了什么。

您可以执行自调度setTimeout路由,而不是使用setInterval:

function workload(callback) {
 var timeout=5000; //default run time
  if(Math.random()>0.5){ timeout=1000; } // special run time (50/50 in this demo)
  setTimeout(workload, timeout);

  //do normal workload:
   console.log(callback, timeout);
} // end workload

// use any time for first run:
setTimeout(workload, 12345);
您还可以使用“静态属性”从外部调整计时器:

function workload(callback) {
  setTimeout(workload, workload.timeout || 5000); //default to 0.2hz

  //do normal workload:
   console.log(callback, workload.timeout);
} // end workload

// use any time for first run:
setTimeout(workload, 2000);

workload.timeout=1000; // change to poll at 1hz;

请注意,我实际上没有实现回调,如果没有bind(),每次执行时参数都将为空。因为函数本身基本上就是回调函数,所以不需要回调函数。您可以轻松地将其中一种模式转换为工厂,在工厂中传递一个工作负载函数、一个默认间隔、一个初始延迟和另一个条件求值器函数,以获得最大的灵活性。

否,您不能修改它。您必须取消它,并用不同的时间再次安排它-或者,如您所述,立即拦截
setInterval
调用。我不习惯在整个堆栈中如此深入,浏览器不给api访问计时器堆栈的权限,以查看和/或修改计时器堆栈上等待计时器触发然后放入任务队列堆栈的间隔,对此我并不感到惊讶。谢谢。我同意你对dandavis的回答,因为我无法控制最初执行的函数/回调/工作流。在您的解决方案中,我看到第三方正在调用setInterval以及其他多个调用,并看到a[1]在需要的地方发生更改。我可以看到这一点的缺点,并可能会保持在'为乐趣'桶。
function workload(callback) {
  setTimeout(workload, workload.timeout || 5000); //default to 0.2hz

  //do normal workload:
   console.log(callback, workload.timeout);
} // end workload

// use any time for first run:
setTimeout(workload, 2000);

workload.timeout=1000; // change to poll at 1hz;