我正在建立一个动态网站,通过jquery的load()加载“body”div中的所有页面。问题是我在加载的PHP页面中有一个使用setInterval循环的脚本,原因是我希望仅在显示该页面时加载脚本。现在我发现脚本在“离开”页面后继续运行(在div中加载其他东西而不刷新)如果我继续离开/返回循环堆栈,我的服务器充满了GET请求(来自javascript)。
离开页面后卸载所有JS的好方法是什么?我可以做一个简单的虚拟var来不加载脚本两次,但我想在离开页面后停止循环,因为它导致无用的流量和喷出控制台错误,因为它应该填充的元素不再存在。
很抱歉,如果已经提出过这个问题,但很难为此提出关键字。
答案 0 :(得分:1)
1)你为什么不试试clearInterval
?
2)如果你有一般(主要)function a( ) { ... }
做某事,你可以用function a() { };
无所事事地覆盖它
3)如果你对某些东西的引用为空它将被垃圾收集
没有提供代码,因此我无法帮助您
答案 1 :(得分:0)
这听起来像你需要重新评估你的设计。您需要删除ajax,或者您不需要在方法名称中发生冲突。
您可以查看以下链接:http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml
其中提供了有关如何从DOM中删除javascript的信息。但是,现代浏览器会将代码留在浏览器的内存中。
答案 2 :(得分:0)
由于您没有处理实际页面加载/卸载,我将构建一个模拟卸载事件的系统。
var myUnload = (function () {
var queue = [],
myUnload = function () {
queue.forEach(function (unloadFunc) {
undloadFunc();
});
queue = [];
};
myUnload.add = function (unloadFunc) {
queue.push(unloadFunc);
};
return myUnload;
}());
加载新网页的代码应该在加载新网页之前运行myUnload()
。
function loadPage(url) {
myUnload();
$('#page').load(url);
}
页面加载的任何代码都可以调用myUnload.add()
来注册一个应该在加载新页面时运行的清理函数。
// some .js file that is loaded by a page
(function () {
var doSomething = function () {
// do something here
},
timer = setInterval(doSomething, 1000);
// register our cleanup callback with unload event system
myUnload.add(function () {
// since all of this code is isolated in an IIFE,
// clearing the timer will remove the last reference to
// doSomething and it will automatically be GCed
// This callback, the timer var and the enclosing IIFE
// will be GCed too when myUnload sets queue back to an empty array.
clearInterval(timer);
});
}());