4

Web ページを XUL iframe にロードする最小限の Firefox 拡張機能に取り組んでいます。(私も試しましたが、同じ結果が得られました。)ページが完全に読み込まれるまでに時間がかかる場合があります。イベントの前に来るはずhtml:iframeのイベントを受信しようとしています。DOMContentLoadedload

(主な理由は、CSS スタイルシートを挿入しようとしているからです。これは、load イベントまで待機してページを「スタイルなし」に表示するのではなく、DOMContentLoaded イベントの直後に行う必要があります。ただし、これは次の目的で使用されます。他の理由も同様であるため、CSS 固有の代替手段は実行可能な回避策ではありません。)

ただし、これまでのところ、loadイベントを受信することしかできDOMContentLoadedず、readyStateイベントも受信できません。

この問題は、以下の XUL を使用して簡単に再現できるはずです。そのchrome://URL を指定して、Firefox のロケーション バーに XUL へのパスを入力するだけです (これに似ています)。

<?xml version="1.0"?>
<!DOCTYPE window>
<window xmlns:html="http://www.w3.org/1999/xhtml"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script type="application/x-javascript">
        window.addEventListener("DOMContentLoaded", function(event){
            try{
                var outElem = document.getElementById("out");
                var out = function(s){
                    outElem.value += s + "\n";
                };

                var frameTest = document.getElementById("iframe-test");

                out("start: " + frameTest.contentDocument.readyState);
                frameTest.addEventListener("DOMContentLoaded",
                    function(e){
                        out("DOMContentLoaded! " + e);
                    },
                    true);
                frameTest.addEventListener("readystatechange",
                    function(e){
                        out("readystatechange: " + e);
                    },
                    true);
                frameTest.addEventListener("load",
                    function(e){
                        out("load: " + e + ", state: " + frameTest.contentDocument.readyState);
                    },
                    true);
                out("all listeners registered, frame location: " + frameTest.contentWindow.location + ", state: " + frameTest.contentDocument.readyState);
            }catch(e){
                alert(e);
            }
        }, true);
    </script>

    <iframe id="iframe-test" type="content" src="http://www.google.com" height="400" width="400"/>
    <textbox id="out" rows="10" cols="80" multiline="true"/>

</window>

デバッグ テキスト ボックスに表示される出力は次のとおりです。

start: uninitialized
all listeners registered, frame location: about:blank, state: uninitialized
load: [object Event], state: complete

DOMContentLoaded!何も出力も出力も受け取らない理由がわかりませんreadystatechange:

動作しない別の最小限の例がhttps://gist.github.com/2985342にあります。

私がすでに参照したページには次のものがあります。

これについては irc.mozilla.org/#extdev で言及しましたが、「他のすべての人に有効です」と「ただし、キャプチャ リスナーを使用するのが最善です」という反応しか得られませんでした。- これが、上記のすべての呼び出しで 3 番目のuseCapture引数を に設定している理由です(ただし、これを false に設定したり、完全に省略したりしても、まだ違いに気づいていません)。trueaddEventListener

ポーリングに頼らずに、これを「正しい方法」で行うことを検討していますcontentDocument.readyState

更新: 「リアルタイム XUL エディター」( https://addons.mozilla.org/en-US/firefox/addon/extension-developer/の一部)を介してサンプリングすると、この例と他の同様の例が期待どおりに機能します。 - ただし、chrome://test/content/test.xulファイルとしてロードされた場合はそうではありません。ロケーションバーからロードすると、この問題の原因となる制限された権限などが存在するというのは本当ですか?

4

2 に答える 2

3

Gecko のドキュメントによると、DOMFrameContentLoadedは代替のイベント リスナーとして機能するはずです。

DOMFrameContentLoaded イベントは、スタイルシート、画像、およびサブフレームの読み込みが完了するのを待たずに、フレームの読み込みと解析が完了すると実行されます。このイベントは DOMContentLoaded に似ていますが、フレームにのみ適用されます。

Firefox および Opera (Presto Engine を使用する Mini またはデスクトップ 12 以降) は、このイベントをサポートしています。

現在、Firefox と Opera はどちらも DOMFrameContentLoaded イベントを実装しています。

フレームが読み込まれると、Opera は owner でイベントを送出しiframeます。その後、このイベントは にバブリングしwindowます。

Firefox は、所有者のドキュメントでイベントを送出しますiframe。に泡立ちwindowます。その要素のターゲットは、iframeコンテンツがロードされた です。所有者ドキュメント自体が に含まれているframe場合、親ドキュメントにイベントが送出されます。event targetコンテンツがロードされたときのフレームのままです (親ドキュメント チェーンの先頭まで続きます)。

参考文献

于 2012-06-26T23:59:59.203 に答える
1

この問題は、Firefox メニュー > Web 開発者 > エラー コンソール > から XUL ページを開いたときに発生しますopen("chrome://yourpage.xul", "", "width=640,height=480");か? ロケーション バーの下にあるブラウザーは、コンテンツ プライマリとしてマークされます。これにより、ページの送信元のプロトコルに関係なく、そこにあるページは制限された特権で実行されます (これは直感に反して当然のことです)。それが問題の原因である可能性がありますが、残念ながら正確な理由をお伝えすることはできません.

このような微妙な問題の次のステップは、irc.mozilla.org#developers に接続して、西海岸が起きているときに問題について質問することです:)。

于 2012-06-24T17:56:54.683 に答える