【问题标题】:How to stop a script completely when its tag is removed删除标签后如何完全停止脚本
【发布时间】:2020-02-11 20:44:12
【问题描述】:

我有一个来自页面跟踪器网站的脚本,它会定期执行某些操作。有时我需要从头开始重新运行脚本。为了实现这一点,我从 DOM 中删除了 script 标签并再次附加它。

由于脚本使用了setInterval,当script标签被移除时,执行不会结束。

您对此有何建议?

【问题讨论】:

标签: javascript html reactjs


【解决方案1】:

打电话给clearInterval 怎么样?
不过,您将需要间隔句柄。

var myVar = setInterval(myTimer, 1000);

function myTimer() {
  var d = new Date();
  var t = d.toLocaleTimeString();
  document.getElementById("demo").innerHTML = t;
}

function myStopFunction() {
  clearInterval(myVar);
}

但如果您不能或不想编辑第 3 方脚本,您可以做一件事:

  • 覆盖 window.setInterval 函数。

喜欢

var backup = window.setInterval;
var my_array = [];


window.setInterval = function(interval, function){
    var handle = backup(interval, function);
   my_array.push(handle);
   return handle;
}

然后你可以从 my_array 中获取所有的句柄,并将它们全部清除。
当然,这必须在您加载任何其他脚本之前完成。

【讨论】:

  • 谢谢,但事实并非如此。间隔已在加载脚本中的某处设置。也许还有不止一个setIntervals,我没有他们的处理程序。有没有办法通过删除script 标签来阻止所有intervals
  • @Afshin:不,您需要清除间隔,删除脚本标签是不够的。您可以重新加载页面,但这是一个丑陋的黑客:window.location.reload();但是您可以覆盖 setInterval-function - 请参阅编辑后的答案。
【解决方案2】:

为了能够使用 clearInterval() 方法,您必须在创建间隔方法时使用变量:

myTimer = setInterval("javascript function", milliseconds);

然后你就可以通过调用 clearInterval() 方法来停止执行了。

clearInterval(myTimer );

使用模块模式,您可以将代码包装在 IFFE 中,以便能够使用它而无需将其从 dom 中删除并重新初始化并重新附加它。

const snifferModule= (function() {
  let globVariable= null;
  let globalArray= [];
  var myVar = setInterval(myTimer, 1000);

 const initialize = function(gv, ga) {
    globVariable= gv;
    globalArray= ga;
  };

 const cleanAndRun= function() {
   clearInterval(myVar);
   // rest of code
  };

return {
    initialize,
    cleanAndRun,

  };
})();

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 2016-05-06
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多