我创建了一个自定义函数来复制 setInterval 函数。 这是我正在尝试做的事情:
<html>
<head>
<script id='scpt_a'>
//custom setInterval function
function interval(func,ti){
try{
func.call(null);
}
catch(err){
throw new Error(err.toString());
}
setTimeout(()=>{interval(func,ti); },ti);
}
//custom setinterval function end
$('#start).click(()=>{
$('body').append("<script id='scpt_b'>interval(()=>
{console.log('hello');},10000);</script>");
});
$('#stop).click(()=>{
$('#scpt_a').remove();
$('#scpt_b').remove();
});
</script>
</head>
<body>
<button id='start'>start</button>
<button id='stop'>stop</button>
</body>
</html>
每当我运行此代码时,它都可以正常工作,即当我单击开始按钮时,它会 append 代码,以便代码执行它并继续打印hello 。现在,当我按下停止按钮时,它删除 append 脚本以及初始(非 append )脚本 。因此,由于脚本不存在,因此它应该停止执行,但它没有发生。
我使用chrome开发工具,我看到点击停止按钮后没有脚本( append 脚本后HTML 文档中存在),但控制台上仍然打印 hello。
请帮我弄清楚为什么会发生这种情况以及如何解决这个问题。
最佳答案
当您向页面添加一些脚本时,浏览器会解析它。当您稍后删除脚本标记时,没关系,脚本已经被解析和处理,并且位于浏览器内存中。因此,尽管您从页面中删除了脚本标记,您的 interval
函数仍将继续运行。
这是这个事实的例证。我添加了对 jQuery 的引用,请参阅第一个警报,然后将其删除,然后删除 jQuery 脚本标记,您可以看到我仍然可以使用 jQuery $
函数:
<script id="s1" src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script>
alert($);
$("#s1").remove();
alert($);
</script>
关于javascript - 即使整个脚本从 html 页面中删除后,setInterval 仍会继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53035419/