卸载通过load()加载的JS以避免重复


Unload JS loaded via load() to avoid duplicates?

我正在构建一个动态网站,通过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);
  });
}());