Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止clearInterval中断setTimeout_Javascript_Settimeout_Clearinterval - Fatal编程技术网

Javascript 如何防止clearInterval中断setTimeout

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

我是第三方javascript开发人员,我的一个客户的页面上有以下代码,这些代码会反复运行:

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