1

ドキュメントが読み込まれるたびに実行する必要がある Mozilla Jetpack ベースのアドオンを作成します。「トップレベルのドキュメント」の場合、これは主に次のコードを使用して機能します ( OserverService = require('observer-service')):

    this.endDocumentLoadCallback = function (subject, data) {
        console.log('loaded: '+subject.location);
        try {
            server.onEndDocumentLoad(subject);
        }
        catch (e) {
            console.error(formatTraceback(e));
        }
    };
    ObserverService.add("EndDocumentLoad", this.endDocumentLoadCallback);

しかし、ユーザーが中クリックまたは (さらに重要なことに!) フレームを使用して新しいタブを開いた場合、コールバックは呼び出されません。そして、このトピックでさえ、ドキュメントではなく、別の拡張機能のソースを読んだだけで理解できました。

では、ドキュメントが読み込まれるたびに実際に呼び出されるコールバックを登録するにはどうすればよいでしょうか?

編集:これは私が望むことをするようです:

function callback (event) {
    // this is the content document of the loaded page.
    var doc = event.originalTarget;

    if (doc instanceof Ci.nsIDOMNSHTMLDocument) {
        // is this an inner frame?
        if (doc.defaultView.frameElement) {
            // Frame within a tab was loaded.
            console.log('!!! loaded frame:',doc.location.href);
        }
        else {
            console.log('!!! loaded top level document:',doc.location.href);
        }
    }
}

var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var mainWindow = wm.getMostRecentWindow("navigator:browser");
mainWindow.gBrowser.addEventListener("load", callback, true);

ここから部分的に取得しました: https://developer.mozilla.org/en/XUL_School/Intercepting_Page_Loads

4

2 に答える 2

0

ありがとうございます

元の質問: タブ ブラウザ モジュールを使用しないのはなぜですか。このようなもの:

var browser = require("tab-browser");

exports.main = function main(options, callbacks) {
initialize(function (config) {
    browser.whenContentLoaded(
        function(window) {
           // something to do with the window
           // e.g., if (window.locations.href === "something")
        }
    );
});

私見よりもはるかにクリーンで、(公式の pageMods モジュールができるまでは) これを行う方法がサポートされています。

于 2010-07-23T11:00:02.727 に答える
0

Addon SDK 1.0 の時点で、これを行う適切な方法はpage-modモジュールを使用することです。

(ドキュメント要素が挿入されたオブザーバー サービス通知を使用して実装されている内部では、通常の拡張機能で使用するか、page-mod が適していない場合に使用できます。)

于 2011-07-04T23:21:17.120 に答える