2012-03-12 8 views
0

jsファイルを含むブラウザのoverlay.xulを使用するアドオンをビルドします。私がウェブページ上のHTMLを修正するために見つけた最も簡単な方法は、私が信じているmdnで見つけたこのコードです。その場でhtmlを挿入する

const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START; 
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP; 

var myListener = { 
    QueryInterface: function(aIID) { 
     if (aIID.equals(Components.interfaces.nsIWebProgressListener) || 
     aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
     aIID.equals(Components.interfaces.nsISupports)) 
     return this; 
     throw Components.results.NS_NOINTERFACE; 
    }, 
    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { }, 
    onLocationChange: function(aProgress, aRequest, aURI) { 
     PageLoad.initialzed = false; 
     PageLoad.init(); 
    }, 
    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { }, 
    onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { }, 
    onSecurityChange: function(aWebProgress, aRequest, aState) { } 
}; 

gBrowser.addProgressListener(myListener); 


var PageLoad = { 
    initialzed : false, 
    browser : null, 
    domain : null, 
    appcontent : null, 

    init : function() { 
     PageLoad.appcontent = document.getElementById("appcontent"); 
     if (PageLoad.appcontent) { 
      PageLoad.appcontent.addEventListener("DOMContentLoaded", PageLoad.load, true); 
     } 
    }, 
    load : function() { 
       //I do this so it only calls the function once 
     if (PageLoad.initialzed == false) { 
      PageLoad.initialzed = true; 
      PageLoad.browser = gBrowser.contentDocument; 
      PageLoad.domain = (PageLoad.browser.location.host.match(/([^.]+)\.\w{2,3}(?:\.\w{2})?$/) || [])[1]; 
      myFunctiontoInsertHTML(); 
     } 

    } 
}; 

それから私はPageLoad.browser.createElement('div')を使用することができるというように、私の機能。これは良い、これまでの作品では、私は複数のタブを開いた状態で、私のPageLoad.domain変数が最後にロードされたタブのドメインが含まれていることを問題に遭遇したりしていますWebページ(2つ以上の異なるページ/タブにHTMLを挿入する際にエラーが発生する)だから、私が変更したいのは、ユーザーが別のタブをクリックするか、関数を呼びたいページをリロードするたびに、私は行き詰まってしまいます。

+1

チェックアウト[上のページのロード](https://developer.mozilla.org/en/Code_snippets/On_page_load)と[URLバーのリスナー](https://developer.mozilla.org/en/Code_snippets/Progress_Listeners#例:_Notification_when_the_value_in_Address_Bar_changes) –

+0

私は自分自身のバリエーションを 'ページの読み込み'リンクに使っていましたが、このURLバーのリスナーはまさに私が必要とするものです。 – thefoyer

答えて

0

gBrowser.contentDocumentは、現在のブラウザタブに読み込まれたページのドキュメントです。ユーザーがタブを切り替えたり別のページに移動したりすると、その値が変更され、古い値(メモリリーク) 。あなたはすべてのブラウザのタブの進捗状況を観察しています。あなたが求めているものを見てください。あなたの場合の意味:aProgress.DOMWindownsIWebProgress.DOMWindowを参照)。また、1つのタブのロードの進行状況に関心がある場合は、DOMContentLoadedイベントリスナーを添付する必要があります。

+0

あなたのすべてのあなたの助けのために今までのWladimirありがとう。私は 'gBrowser.addProgressListener'でより大きな問題に遭遇したようです。 奇妙なことに、私はアドオンをインストールした後に動作します。ブラウザを閉じてもう一度起動すると、アドオンは期待どおりに動作しますが、ブラウザをもう一度閉じてバックアップを開くと動作しません。 エラーコンソールを見ると、「gBrowser.addProgressListener'は関数ではありません」と表示されます。私がそれを再インストールするまで、アドオンは再び動作しません。リンスとリピート、ブラウザを3回再起動するともう動作しません。 – thefoyer

関連する問題