clearInterval无法在javascript chrome扩展中使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了clearInterval无法在javascript chrome扩展中使用相关的知识,希望对你有一定的参考价值。
我正在尝试制作镀铬扩展,并在我的content script
只运行在www.youtube.com
它应该检查,document.getElementById("movie_player")
,如果一个特定的div
元素已加载或不加载。如果不是setInterval
并等一下。如果已加载,则运行alert("Hello")
和clearInterval
,这将结束脚本。
但是,它不起作用。即使在我找到元素之后,它也会显示“Hello”,它继续说你好,这意味着setInterval
在1000毫秒后仍在调用我的函数,即使它应该被清除。
这是我的content.js
文件:
var timeOut;
function CheckDOMChange()
{
moviePlayer = document.getElementById("movie_player");
if(moviePlayer !== null)
{
WhenVideoLoads();
}
timeOut = setInterval("CheckDOMChange();", 1000);
}
function WhenVideoLoads()
{
alert("Hello");
clearInterval(timeOut);
}
CheckDOMChange();
正如您所看到的,我将timeOut
设为全局变量,因此它不应该是范围问题。所以我真的不知道问题是什么,因为条件得到满足并且clearInterval
被调用。
任何帮助将非常感激。
问题是你在函数内部有setInterval
。基本上,对于每个调用,您都要设置间隔,这会创建多个setIntervals。从函数中删除setInterval
var timeOut;
function CheckDOMChange() {
moviePlayer = document.getElementById("movie_player");
if (moviePlayer !== null) {
WhenVideoLoads();
}
}
function WhenVideoLoads() {
alert("Hello");
clearInterval(timeOut);
}
timeOut = setInterval("CheckDOMChange();", 1000);
通过递归调用CheckDOMChange
,您实际上是以指数方式创建计时器,而您只是在调用WhenVideoLoads
时清除最后一个计时器。
您可以尝试运行此代码段并检查控制台以查看发生的情况,并看到单击该按钮将清除最后一个计时器,但不会清除之前创建的所有计时器。
var timeOut;
var counter = 0;
function CheckDOMChange()
{
console.log("counter :", counter);
if (counter > 16) {
console.log("Stop creating new timers!");
return;
}
timeOut = setInterval("CheckDOMChange();", 5000);
console.log("timeOut :", timeOut);
counter ++;
}
function WhenVideoLoads()
{
console.log("Clearing ", timeOut);
clearInterval(timeOut);
}
CheckDOMChange();
<button onclick="WhenVideoLoads()" id="clear">Clear timer</button>
以上是关于clearInterval无法在javascript chrome扩展中使用的主要内容,如果未能解决你的问题,请参考以下文章
在javascript中 setInterval()clearInterval()clearTimeout()等等常用的函数的含义
clearInterval 在 componentWillUnmount 中不起作用