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

JavaScript - Is it possible to modify the behaviour of setInterval/setTimeout used by third party scripts (externally hosted)

本文关键字:setInterval setTimeout 是否 修改 第三方 外部 脚本 JavaScript      更新时间:2023-09-26

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

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

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

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

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

这可能是结果(一个 setInterval,其中所有间隔>= 100 秒都替换为 100 秒)

// above the use of setInterval by third party code
(function (w, maxVal) {
  var f = w.setInterval;
  w.setIntervalOld = f;
  w.setInterval = function () {
    var a = arguments;
    if(a.length >= 2 && (a[1] > maxVal)) {
      a[1] = maxVal;
    }
    f.apply(w, a);
  };
})(window, 100000);

我试图以最连贯的方式进行黑客攻击,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(),每次执行参数都将为空。 因为函数本身基本上是回调,所以你不需要回调。您可以轻松地将这些模式之一转换为工厂,在该工厂中,您可以为其传递工作负载函数、默认间隔、初始延迟和另一个条件评估器函数,以实现最大的灵活性。