我正在构建一个动态网站,通过jquery的load()加载"body"div内的所有页面。问题是我有一个脚本循环与setInterval内加载的PHP页面,原因是我希望脚本加载只有当页面显示。现在我发现,脚本继续运行后,即使"离开"页面(加载其他东西在div内没有刷新),如果我继续离开/返回循环堆栈泛滥我的服务器与GET请求(从javascript)。
离开页面后卸载所有JS的好方法是什么?我可以做一个简单的虚拟变量来不加载脚本两次,但我想在离开页面后停止循环,因为它会导致无用的流量和喷出控制台错误,因为它应该填充的元素不再存在。
如果已经有人问过这个问题了,很抱歉,但是要想出这个关键字真的很难。
1)你为什么不试试clearInterval
呢?2)如果你有一个一般的(主要的)function a( ) { ... }
做一些事情,你可以用function a() { };
不做任何事情来覆盖它3)如果你null引用的东西,它将被垃圾收集
没有提供代码,所以我不能做更多的帮助你
听起来你真的需要重新评估你的设计了。要么你需要放弃ajax,要么你不需要在你的方法名中有冲突。
您可以查看此链接:http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml
给出了如何从DOM中删除javascript的信息。但是,现代浏览器会将代码留在浏览器的内存中。
由于您不处理真实的页面加载/卸载,我将构建一个模拟卸载事件的系统。
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);
});
}());