0

<browser>指定された URL が要素に読み込まれる前に、いくつかのアクションを実行しようとしています。<browser>サイドバーまたはタブに表示できます。

例: (コンテキストはブラウザのメイン ウィンドウです):

// it can be also browser of tab
var browser = document.getElementById("sidebar"); // <xul:browser>

// execute a function when window of browser will be prepared for loading new content but before any script will be executed
execOnWindowPrepared(browser, function(window) {
    // e.g. inject something
    window.foo = "bar";
});

// load an uri 
browser.loadURI("chrome://foo/content/bar.xul"); // (can be also http:)

まだ古いウィンドウを指しているloadURIため、ステートメントの直後にアクションを実行できないことに注意してください。browser.contentWindow

おそらくこれには進行状況リスナーを使用できますが、待機する必要があるフラグについて混乱しています。

4

2 に答える 2

0

nsIObserverServiceのcontent-document-global-created または document-element-inserted 通知を使用します。どちらを使用するかは、スクリプトの実行内容によって異なります。例のようにウィンドウレベルの変数を設定するだけの場合は、 content-document-global-created が最適です。要素を挿入する必要がある場合、または<html>要素を利用できるようにする必要がある場合は、document-element-inserted の方が適しています。

document-element-inserted は、@run-at document-start を含めるときにGreasemonkey が使用するメソッドです。

于 2013-11-15T22:12:24.997 に答える
0

私はそのようなアプローチを使用して終了しました。試行錯誤してコーディングしたので、場合によっては間違っているかもしれませんが、多くのテストで問題に気づきませんでした。

// opens aUrl in aBrowser and call an action defined in aCallback immediately after window is prepared
function loadInBrowserWithCallback (aBrowser, aUrl, /* function(window) */ aCallback) {
    var loadedUrl = nsIIOService.newURI(aUrl, null, null).spec // canonify chrome url (what mean 'canonifing': https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIChromeRegistry#canonify%28%29 )
    var lastWindow = aBrowser.contentWindow;
    lastWindow.__thisIsPrevWin = true;
    var progressListener = { 
        onLocationChange : function(aWebProgress, aRequest, aLocation, aFlags) { 
            var window = aWebProgress.DOMWindow;
            if(!window.__thisIsPrevWin && window.location.href === loadedUrl) {
                // the property assigned to previus window was removed and location.href isn't any transitional url
                aBrowser.removeProgressListener(this);
                aCallback(window);
            }
        },
        onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
            var window = aWebProgress.DOMWindow;
            if(!window.__thisIsPrevWin && window.location.href === loadedUrl) {
                aBrowser.removeProgressListener(this);
                aCallback(window);
            }
        },
        onSecurityChange: function(aWebProgress, aRequest, aState) {
            var window = aWebProgress.DOMWindow;
            if(!window.__thisIsPrevWin && window.location.href === loadedUrl) {
                aBrowser.removeProgressListener(this);
                aCallback(window);
            }
        },
        onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
            var window = aWebProgress.DOMWindow;
            if(!window.__thisIsPrevWin && window.location.href === loadedUrl) {
                aBrowser.removeProgressListener(this);
                aCallback(window);
            }
        },
        onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) {
            var window = aWebProgress.DOMWindow;
            if(!window.__thisIsPrevWin && window.location.href === loadedUrl) {
                aCallback(window);
                aBrowser.removeProgressListener(this);
            }
        },
        QueryInterface: function(aIID) {
            if (aIID.equals(Ci.nsIWebProgressListener) ||
                aIID.equals(Ci.nsISupportsWeakReference) ||
                aIID.equals(Ci.nsISupports))
                return this;
           throw Cr.NS_NOINTERFACE;
        }
    };
    aBrowser.addProgressListener(progressListener, Ci.nsIWebProgress.NOTIFY_ALL);
    aBrowser.loadURI(aUrl);
};
于 2013-11-16T10:14:19.013 に答える