Javascript 如何防止clearInterval中断setTimeout
我是第三方javascript开发人员,我的一个客户的页面上有以下代码,这些代码会反复运行:Javascript 如何防止clearInterval中断setTimeout,javascript,settimeout,clearinterval,Javascript,Settimeout,Clearinterval,我是第三方javascript开发人员,我的一个客户的页面上有以下代码,这些代码会反复运行: for (var i = 1; i < 99999; i++) { window.clearInterval(i); } 如果覆盖内置的clearInterval,我唯一想做的事情就是不清除我的计时器,但这对我来说似乎是非常错误和肮脏的 var originalClearInterval = window.clearInterval; var exampleLoop = setInte
for (var i = 1; i < 99999; i++) {
window.clearInterval(i);
}
如果覆盖内置的clearInterval,我唯一想做的事情就是不清除我的计时器,但这对我来说似乎是非常错误和肮脏的
var originalClearInterval = window.clearInterval;
var exampleLoop = setInterval(function() {
console.log('loop running');
if(typeof window.stopRunning !== 'undefined' && window.stopRunning === true) {
window.clearInterval = originalClearInterval;
clearInterval(exampleLoop);
console.log('loop finished');
}
}, 50);
window.clearInterval = function(timerId) {
if(timerId !== exampleLoop) {
originalClearInterval.apply(this, arguments);
}
}
所以有一种方法:将setTimeout调用放在一个孤立的地方,比如
WebWorker
或IFrame
,然后提供一些事件来监听
我知道这只是一个setTimeout的黑客攻击,但比替换clearInterval更好 所以有一种方法:将setTimeout调用放在一个孤立的地方,比如
WebWorker
或IFrame
,然后提供一些事件来监听
我知道这只是一个setTimeout的黑客攻击,但比替换clearInterval更好 我能想到的唯一方法就是玩脏游戏-重新定义window.clearInterval,忽略超时ID的清除:
//创建一个数组来存储要忽略的超时ID。
window.ignoreTimeoutIds=[];
//将原始clearInterval函数存储为另一个属性
window.clearInterval2=window.clearInterval;
//重新定义clearInterval以不清除它是否是您的TimeOutID之一
window.clearInterval=函数(有效期){
if(window.ignoreTimeoutIds.indexOf(intervalId)>-1)
console.log('未清除1');//用于演示
其他的
窗口。clearInterval2(有效期);
};
(功能(){
//设置超时并获取其ID
var timeoutId=setTimeout(函数(){
console.log('bar');
//不要忘记从忽略列表中删除timeoutId
window.ignoreTimeoutIds.splice(window.ignoreTimeoutIds.indexOf(timeoutId))
}, 5000);
//将timeoutID添加到忽略列表
window.ignoreTimeoutIds.push(timeoutId);
}());
对于(变量i=1;i<99999;i++){
窗口。清除间隔(i);
}
我能想到的唯一方法就是玩脏游戏-重新定义window.clearInterval,忽略超时ID的清除:
//创建一个数组来存储要忽略的超时ID。
window.ignoreTimeoutIds=[];
//将原始clearInterval函数存储为另一个属性
window.clearInterval2=window.clearInterval;
//重新定义clearInterval以不清除它是否是您的TimeOutID之一
window.clearInterval=函数(有效期){
if(window.ignoreTimeoutIds.indexOf(intervalId)>-1)
console.log('未清除1');//用于演示
其他的
窗口。clearInterval2(有效期);
};
(功能(){
//设置超时并获取其ID
var timeoutId=setTimeout(函数(){
console.log('bar');
//不要忘记从忽略列表中删除timeoutId
window.ignoreTimeoutIds.splice(window.ignoreTimeoutIds.indexOf(timeoutId))
}, 5000);
//将timeoutID添加到忽略列表
window.ignoreTimeoutIds.push(timeoutId);
}());
对于(变量i=1;i<99999;i++){
窗口。清除间隔(i);
}
了解他们为什么运行那段难看的代码会很有趣
无论如何,你想写一些更丑的东西的想法是朝着正确的方向迈出的一步,但是你可以在不涉及其自身功能的情况下,将丑推到一个水平(记住,你是第三方,我很惊讶你甚至有权查看他们的代码)。您甚至不需要进行额外的id管理:
function setBulletproofTimeout( code, delay ) {
var minId = 99999;
var id = 0;
var myIntervals = [];
for ( var i = 0; i<=minId; i++) {
id = window.setTimeout(code, delay);
if( id >= minId ) {
// that's the One, kill the others
myIntervals.forEach( function( e ) { window.clearInterval( e ); } );
return id;
}
else {
myIntervals.push( id );
}
}
}
函数setBulletProof超时(代码,延迟){
var minId=99999;
var-id=0;
var MyInterval=[];
对于(变量i=0;i=minId){
//就是那个,杀了其他人
forEach(函数(e){window.clearInterval(e);});
返回id;
}
否则{
myinterval.push(id);
}
}
}
了解他们为什么运行那段难看的代码会很有趣
无论如何,你想写一些更丑的东西的想法是朝着正确的方向迈出的一步,但是你可以在不涉及其自身功能的情况下,将丑推到一个水平(记住,你是第三方,我很惊讶你甚至有权查看他们的代码)。您甚至不需要进行额外的id管理:
function setBulletproofTimeout( code, delay ) {
var minId = 99999;
var id = 0;
var myIntervals = [];
for ( var i = 0; i<=minId; i++) {
id = window.setTimeout(code, delay);
if( id >= minId ) {
// that's the One, kill the others
myIntervals.forEach( function( e ) { window.clearInterval( e ); } );
return id;
}
else {
myIntervals.push( id );
}
}
}
函数setBulletProof超时(代码,延迟){
var minId=99999;
var-id=0;
var MyInterval=[];
对于(变量i=0;i=minId){
//就是那个,杀了其他人
forEach(函数(e){window.clearInterval(e);});
返回id;
}
否则{
myinterval.push(id);
}
}
}
这基本上是因为他们使用了完全错误的方法将间隔设置为变量,因此您可以clearInterval(intervalID)
而不是清除所有内容。@Rhumborl-正确。@SterlingArcher-不幸的是,由于我是第三方开发人员,我无法修改客户端站点上的代码并阻止他们执行糟糕的clearInterval循环使用setTimeout
或setInterval
创建的计时器之间没有区别,当这些方法返回“标识符”时,您可以交替使用clearInterval
或clearTimeout
来清除它们一个硬核,杀光所有的脚本这样说/用相当清楚的话喊道,“我们不希望任何计时器或间隔在我们的页面上运行,句号。”你的客户应该下定决心。这基本上是因为他们使用了完全错误的方法将你的间隔设置为一个变量,这样你就可以clearInterval(intervalID)
而不是清除所有内容。@Rhumborl-正确。@SterlingArcher-不幸的是,由于我是第三方开发人员,我无法修改客户端站点上的代码并阻止他们执行糟糕的clearInterval循环使用setTimeout
或setInterval
创建的计时器之间没有区别,当这些方法返回“标识符”时,您可以使用clearInterval
或