我正在开发一个将网页加载到 XUL iframe 中的最小 Firefox 扩展。(我也尝试了html:iframe
,但遇到了相同的结果。)页面可能需要一些时间才能完全加载 - 我正在尝试接收DOMContentLoaded
事件,它应该在事件之前load
发生。
(主要原因是我试图注入一个 CSS 样式表,这应该在 DOMContentLoaded 事件之后立即完成,而不是等待页面出现“无样式”直到加载事件。但是,这将用于还有其他原因,因此特定于 CSS 的替代方案不是可行的解决方法。)
但是,到目前为止,我只能接收load
事件 - 而不是DOMContentLoaded
事件readyState
。
使用下面的 XUL 应该很容易重现该问题,并且只需在 Firefox 位置栏中输入 XUL 的路径给定其chrome://
URL(类似于此):
<?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 上提到了这一点,但只能获得“对其他人有效”和“最好使用捕获侦听器”的响应。- 这就是为什么我在上述所有调用中都useCapture
设置了第三个参数(尽管我还没有注意到将它设置为 false 或完全省略它的任何区别)。true
addEventListener
我希望以“正确的方式”做到这一点,而不是诉诸于contentDocument.readyState
.
更新: 例如,当通过“实时 XUL 编辑器”(https://addons.mozilla.org/en-US/firefox/addon/extension-developer/的一部分)进行采样时,此示例和其他类似示例按预期工作- 但不是作为chrome://test/content/test.xul
文件加载时。当通过位置栏加载时,是否存在导致此问题的受限权限等?