问题描述
|
我正在编写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);
应用程序内容上的第二个“加载”侦听器对于我的需求而言太慢了。
DOM完成加载后,会触发\'load \'事件。
我的问题:是否有人对文档开始加载后(DOM的加载事件之前)如何运行代码有想法? (希望存在一个onBeforeLoad或onRequestStart事件)
在Chrome扩展程序中,我们可以在\'manifest.json \'中使用\“ run_at \”:\“ document_start \”,
在Safari扩展程序中,我们可以在扩展程序生成器中使用\'Starting script \'
但是在Firefox中...我不知道该怎么做。
我需要它来开始查看DOM中的元素(但是这是另一回事了)。
感谢您的帮助。
解决方法
这里有一个很好的解释:
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);
,您可以从事件侦听器中取出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);
}
}
您可能必须进行一些“ 5”调试,以查看每个浏览器是否以相同方式对待null元素。
,您是否将appcontent元素的“ 6”设置为XUL源代码中的属性?这使事情变得更加棘手,因为XUL不喜欢您在加载元素时访问元素。您可以尝试的是在元素上添加派生的XBL绑定,并在那里定义捕获事件处理程序。否则您可能会发现the7ѭ事件还为时过早。否则,我建议将appcontent元素保留为空白,仅在将加载事件处理程序添加到主窗口的加载事件处理程序中之后再加载它。