JQuery Tabs在Firefox扩展中创建内存泄漏

时间:2012-05-25 06:02:48

标签: javascript jquery-ui memory-leaks firefox-addon jquery-tabs

我在Firefox扩展程序中使用jQuery标签库。 标签功能在我的扩展程序中正常工作。然而,它正在创造一个僵尸隔间。

这就是我使用标签的方式:

$j(mydiv).find('#targetid').tabs({selected: 2});

当我评论此行并安装扩展时,没有内存泄漏。知道发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

问题是jQuery UI存在于浏览器窗口中,只要浏览器窗口保持打开状态,它就会保持“活着”状态。但是,选项卡位于内容选项卡中,只要您关闭该选项卡,它们就会消失。 jQuery UI必须保留对某些选项卡的本地引用,并且即使在关闭选项卡(僵尸隔离专区)之后,该引用也不会让选项卡进行垃圾回收。一种解决方案是找到参考并摆脱它。但即使你以这种方式解决它(我不能因为我对jQuery知之甚少) - 问题可能会在以后回来,因为jQuery UI被设计为在网页中运行,这种内存泄漏不被考虑那里。

更强大的解决方案是在与其负责的UI相同的上下文中运行jQuery UI。这样当你关闭标签时,jQuery UI及其小部件都将被处理 - 不再有僵尸隔间。这可以使用message manager来完成,例如:

// Load content script into the current tab
var contentScriptURL = "chrome://.../content/contentScript.js";
gBrowser.selectedBrowser.messageManager.loadFrameScript(contentScriptURL, false);

然后contentScript.js将使用mozIJSSubscriptLoader将jQuery和jQuery UI加载到其上下文中:

var scriptLoader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                     .getService(Components.interfaces.mozIJSSubScriptLoader);
scriptLoader.loadSubScript("chrome://.../content/jquery.js");
var jQuery = jQuery.noConflict(true);
scriptLoader.loadSubScript("chrome://.../content/jquery-ui.js", jQuery);
...
$j(mydiv).find('#targetid').tabs({selected: 2});

此内容脚本与您在叠加层中运行的脚本具有相同的chrome权限,但是一旦关闭选项卡,它将被卸载 - 以及它可能保留在该选项卡内容中的任何引用。