我正在编写Firefox扩展程序,
这是我的XUL(没问题)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE overlay SYSTEM "chrome://locale/myDtd.dtd">
<page id="overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<script type="application/x-javascript" src="chrome://addon/content/test.js" />
</page>
这是javascript test.js
中有问题的部分window.addEventListener("load",
function(event) {
var appcontent = window.document.getElementById("appcontent");
appcontent.addEventListener("load",onEventLoad,true);
}, true);
appcontent上的第二个“加载”监听器对我的需求来说太慢了。 在加载DOM时会触发'load'事件。
我的问题:有没有人知道如何在文档开始加载时(在DOM的加载事件之前)运行代码? (希望存在onBeforeLoad或onRequestStart事件)
在Chrome扩展程序中,我们可以在'manifest.json'中使用“run_at”:“document_start”, 在Safari扩展中,我们可以在扩展构建器中使用“启动脚本” 但是在Firefox中...我不知道如何做同样的伎俩。
我需要这个,一旦它们到达就开始查看DOM中的元素(但这是另一个故事)。
感谢您的帮助,谢谢大家!
答案 0 :(得分:3)
这里有一个很好的解释:
http://blog.webmynd.com/2011/04/04/equivalent-to-beforeload-event-for-firefox-extensions/
建议的解决方案依赖于Firefox Observers和http-on-modify-request:
Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService)
.addObserver({
observe: function(aSubject, aTopic, aData) {
if ("http-on-modify-request" == aTopic) {
var url = aSubject
.QueryInterface(Components.interfaces.nsIHttpChannel)
.originalURI.spec;
if (url && url.match('facebook')) {
aSubject.cancel(Components.results.NS_BINDING_SUCCEEDED);
}
}
}
}, "http-on-modify-request", false);
答案 1 :(得分:0)
你可以从eventlistener中取出var appcontent = window.document.getElementById("appcontent");
并执行setInterval直到它实际看到DOM元素被填充了吗?
init();
function init(){
var intval = setInterval ( "checkForElement()", 200 );
}
function checkForElement(){
if (document.getElementById('appcontent') != 'undefined'){
clearInterval(intval);
var appcontent = window.document.getElementById("appcontent");
appcontent.addEventListener("load",onEventLoad,true);
}
}
您可能需要进行一些alert(document.getElementById('appcontent'));
调试,以查看每个浏览器是否以相同的方式处理null元素。
答案 2 :(得分:0)
您是否将appcontent元素的src
设置为XUL源代码中的属性?这使得事情变得棘手,因为XUL不喜欢你在加载时访问元素。你可以尝试的是在元素中添加派生的XBL绑定,并在那里定义一个捕获事件处理程序。或者您可能会发现DOMContentLoaded
事件足够早。否则我建议将appcontent元素留空,只在主窗口的load事件处理程序中添加了load事件处理程序后才加载它。