我在我的 Firefox 扩展中使用 jQuery 选项卡库。标签功能在我的扩展程序中运行良好。然而,它正在创建一个僵尸隔间。
这就是我使用标签的方式:
$j(mydiv).find('#targetid').tabs({selected: 2});
当我评论这一行并安装扩展时,没有内存泄漏。知道发生了什么吗?
我在我的 Firefox 扩展中使用 jQuery 选项卡库。标签功能在我的扩展程序中运行良好。然而,它正在创建一个僵尸隔间。
这就是我使用标签的方式:
$j(mydiv).find('#targetid').tabs({selected: 2});
当我评论这一行并安装扩展时,没有内存泄漏。知道发生了什么吗?
问题是 jQuery UI 存在于浏览器窗口中,只要浏览器窗口保持打开状态,它就会保持“活动”状态。但是,这些选项卡位于内容选项卡中,一旦您关闭该选项卡,它们就会消失。jQuery UI 必须在某处保留对选项卡的本地引用,并且即使在选项卡关闭后(僵尸隔间),该引用也不会让选项卡收集垃圾。一种解决方案是找到该参考并摆脱它。但是,即使您以这种方式解决了它(我不能,因为我对 jQuery 了解不够) - 由于 jQuery UI 设计为在网页中运行,因此问题可能会在稍后再次出现,因此不会考虑这种内存泄漏那里。
更健壮的解决方案是在与它负责的 UI 相同的上下文中运行 jQuery UI。这样,当您关闭选项卡时,jQuery UI 及其小部件都将被释放 - 不再有僵尸隔间。这可以使用消息管理器来完成,例如:
// Load content script into the current tab
var contentScriptURL = "chrome://.../content/contentScript.js";
gBrowser.selectedBrowser.messageManager.loadFrameScript(contentScriptURL, false);
然后使用mozIJSSubscriptLoadercontentScript.js
将 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 权限,但一旦关闭选项卡,它将被卸载 - 以及它可能保留对该选项卡内容的任何引用。