Web ページを XUL iframe にロードする最小限の Firefox 拡張機能に取り組んでいます。(私も試しましたが、同じ結果が得られました。)ページが完全に読み込まれるまでに時間がかかる場合があります。イベントの前に来るはずhtml:iframe
のイベントを受信しようとしています。DOMContentLoaded
load
(主な理由は、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にあります。
私がすでに参照したページには次のものがあります。
- XUL では、ブラウザタグの読み込みが完了したことをどのように知ることができますか?
- 同一生成元ポリシーを回避する方法
- https://developer.mozilla.org/en/DOM/element.addEventListener
- https://developer.mozilla.org/en/DOM/DOM_event_reference
これについては irc.mozilla.org/#extdev で言及しましたが、「他のすべての人に有効です」と「ただし、キャプチャ リスナーを使用するのが最善です」という反応しか得られませんでした。- これが、上記のすべての呼び出しで 3 番目のuseCapture
引数を に設定している理由です(ただし、これを false に設定したり、完全に省略したりしても、まだ違いに気づいていません)。true
addEventListener
ポーリングに頼らずに、これを「正しい方法」で行うことを検討していますcontentDocument.readyState
。
更新: 「リアルタイム XUL エディター」( https://addons.mozilla.org/en-US/firefox/addon/extension-developer/の一部)を介してサンプリングすると、この例と他の同様の例が期待どおりに機能します。 - ただし、chrome://test/content/test.xul
ファイルとしてロードされた場合はそうではありません。ロケーションバーからロードすると、この問題の原因となる制限された権限などが存在するというのは本当ですか?