0

私は Firefox アドオンに取り組んでおり、特定のサイトのコンテンツを監視し、DOM の変更に対応する必要があります。現在、私はイベントを組み合わせて使用​​しgBrowser.contentDocument.getElementsByClassName("class")DOMSubteeeModifiedいます。しかし、タブがアクティブな場合にのみ機能することに気付きました。別のタブを使用して離れていて、非アクティブなタブで DOM が変更された場合、それは機能しません。どうすればこれを回避できますか? Firefox の MDN はかなり散らばっており (時代遅れの場合もあります)、初心者にとっては非常にイライラさせられます。

これが私がやっていることの簡略化されたバージョンです:

var MyExtension = {
    init() : function() {
        if("gBrowser" in window) {
            gBrowser.addEventListener("DOMContentLoaded", function(e){this.onPageLoad(e);},false);
        },

   onPageLoad: function(e) {
       var doc = e.originalTarget;
       if((/http://xxxx.xyz/v/[0-9a-z]/).test(doc.location.href)) {
           MyExtension.XXX.handler(e);
       }
       e.originalTarget.defaultView.addEventListener("unload", function(e){MyExtension.onUnload(e);}, false);
   },

   onUnload: function(e) {
       if((/http://xxxx.xyz/v/[0-9a-z]/).test(e.originalTarget.location.href)) {
           //remove listeners and nullify references to dom objects
   }
};

MyExtension.XXX = {
    handler : function(e) {
        //get dom element with gBrowser.contentDocument.getElementsByClassName("class");
        //bind DOMSubtreeModified listener, attach a function to handle the event
    }
};

window.addEventListener("load", function(e) {
    window.removeEventListener("load", load, false);
    MyExtension.init();
}, false);
4

1 に答える 1

0

ここgBrowser.selectedBrowserに文書化されているように使用して、私がフォローしているテクニックは次のとおりです

var MyExtension = {
    tab : null, //<---- added this line
    init() : function() {
        if("gBrowser" in window) {
            gBrowser.addEventListener("DOMContentLoaded", function(e){this.onPageLoad(e);},false);
    },

    onPageLoad: function(e) {
       var doc = e.originalTarget;
       if((/http://xxxx.xyz/v/[0-9a-z]/).test(doc.location.href)) {
           this.tab = gBrowser.selectedBrowser; //<--- GET REFERENCE TO CURRENT TAB
           MyExtension.XXX.handler(e);
       }
       e.originalTarget.defaultView.addEventListener("unload", function(e){MyExtension.onUnload(e);}, false);
    },

    onUnload: function(e) {
       if((/http://xxxx.xyz/v/[0-9a-z]/).test(e.originalTarget.location.href)) {
           //remove listeners and nullify references to dom objects
       }
    };

    MyExtension.XXX = {
        handler : function(e) {
        //get dom element
        MyExtension.tab.contentDocument.getElementsByClassName("class"); //<--- GET CONTENT DOCUMENT INSIDE DESIRED TAB
        //bind DOMSubtreeModified listener, attach a function to handle the event
    }
};
于 2013-06-24T18:54:46.860 に答える