我在使用 AJAX
时遇到了问题导航,问题是加载的 javascript 文件在加载新内容后仍保留在浏览器中,即使它们不在 DOM
中也是如此。不再,它们显示为 VM
浏览器控制台中的文件并执行其中的代码。我不希望发生这种情况,因为当新内容来自 AJAX
时,它应该被替换的 javascript 文件。 .
我的 DOM 结构是这样的:
<body>
<header></header>
<main id="contentToBeReplaced">
<p>New content with its own js</p>
<script>
var script = "js/new.js";
$.getScript(script);
</script>
</main>
<footer></footer>
<script src="js/main.js"></script>
</body>
每次加载带有自己的 javascript 文件的页面时,都会出现一个新的 VM
归档并保留所有旧的,这是一个问题:
那么,这是什么问题,我该如何解决?我需要防止重复文件并在加载新文件时删除 js 文件。
最佳答案
Javascript 全局执行上下文中的每个唯一条目只能表示单个对象或变量。将相同的函数重复加载到全局上下文将一次又一次地替换函数代码。
您应该管理延迟加载的脚本,使它们在您的全局上下文(或您使用的框架)中代表相同的条目
看下面的示例js代码,假设在两个不同的时间延迟加载
//script 1
var dynFun = function() {
console.log('Loaded early');
{
//script 2
var dynFun = function() {
console.log('Loaded late');
{
现在,如果您加载脚本一并执行 dynFun()
,它将注销 “Loaded early”
。现在,此时,如果您加载第二个脚本并再次执行 dynFun()
,它将注销 "Loaded late"
。
但是,如果这些函数中的每一个都启动像 setTimeout
这样的自动过程,它们将继续运行直到页面关闭。
在这种情况下,您的动态脚本应该先做一些清理工作。
var timeTracker; //This is global
var dynFun = function() {
if (timeTracker)
clearTimeout(timeTracker)
timeTracker = setTimeout(someFn, 1000)
{
记住——你不能决定在像 JS 这样的垃圾收集语言中释放内存。您只能通过操纵对对象的引用来欺骗清理过程。
关于Javascript 文件在 ajax 导航中出现重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56851456/