0

Firefox 확장 기능에서 jQuery 탭 라이브러리를 사용하고 있습니다. 내 기능에서 탭 기능이 정상적으로 작동합니다. 그러나 그것은 좀비 구획을 만들고 있습니다.JQuery Firefox 확장 기능에서 메모리 누수가 발생하는 탭

이 내가 탭을 사용하고 방법은 다음과 같습니다

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

내가이 줄을 주석 및 확장을 설치하는 경우에는 메모리 누수가 없다. 무슨 일이 일어나고 있는지 아십니까?

+0

이 컨텍스트는 무엇입니까? jQuery UI 라이브러리가 확장 컨텍스트에로드되는 동안 jQuery 탭을 컨텐츠 페이지에 적용하고 있습니까? –

+0

예 콘텐츠 페이지에 탭을 적용하고 있습니다. – MKumar

+0

그리고 jQuery UI를 어디서로드 했습니까? 콘텐츠 스크립트, XUL 오버레이, 애드온 SDK 모듈? –

답변

1

문제는 jQuery UI가 브라우저 창에 있으며 브라우저 창이 열려있는 한 "활성"상태를 유지한다는 것입니다. 그러나 탭은 내용 탭에 있으며 탭을 닫으면 바로 사라집니다. jQuery UI는 탭에 대한 로컬 참조를 어딘가에 유지해야하며 해당 참조는 탭이 닫힌 후에도 (가비지 컴 파트먼트) 가비지 수집을 허용하지 않습니다. 한 가지 해결책은 참조를 찾아서 제거하는 것입니다. 그러나 비록 당신이 그것을 이렇게 해결했다 할지라도 (나는 jQuery에 대해 충분히 알지 못한다.) jQuery UI가 웹 페이지에서 실행되도록 설계 되었기 때문에 문제가 다시 발생할 가능성이있다. 이러한 메모리 누수는 고려되지 않는다. 그곳에.

jQuery UI를 담당하는 UI와 동일한 컨텍스트에서 jQuery UI를 실행하는 것이 더 강력한 솔루션입니다. 이렇게하면 탭을 닫을 때 jQuery UI와 그 위젯이 모두 삭제되어 좀비 구획이 더 이상 필요 없습니다. mozIJSSubscriptLoader를 사용

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

그리고 contentScript.js 다음의 상황에 jQuery를 및 jQuery를 UI를로드 할 것이다 : 이것은 message manager 예를 들어, 사용하여 수행 할 수

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}); 

이 콘텐츠 스크립트는 스크립트와 동일한 크롬 권한이 오버레이에서 실행되지만 탭이 닫히면 언로드됩니다. 탭과 함께 탭의 내용을 유지할 수도 있습니다.

+0

감사합니다 블라디미르! 이것을 시도하고 다시 당신에게 돌아갈 것입니다. – MKumar

+0

아래 내용은 내 콘텐츠 스크립트입니다. (function() { \t \t \t var scriptLoader = 구성 요소 .classes [ "@의 mozilla.org/moz/jssubscript-loader;1"] \t \t \t \t \t \t \t \t \t \t \t \t \t .getService (Components.interfaces.mozIJSSubScriptLoader) \t \t \t scriptLoader.loadSubScript ("chrome : //aqqin/content/js/jquery-1.7.1.js", content); \t \t \t var jQ = content.jQuery.noConflict(); \t \t \t scriptLoader.loadSubScript ("chrome : //aqqin/content/js/jquery.ui.tabs.min.js", jQ); }})(); ========================================================================================================== ============ 오류 내용을 가져 오는 중입니다.jQuery는 정의되지 않았습니다 – MKumar

+0

콘텐츠 스크립트는 충돌 할 것이 없습니다.이 컨텍스트에서는 다른 어떤 것도 실행되지 않습니다 (웹 페이지 스크립트는 사용자를 볼 수 없습니다). 그렇다면 스크립트를 변수에로드하는 이유는 무엇입니까? –