Firefox扩展的“加载事件”之前的事件?

时间:2011-03-16 18:33:34

标签: firefox dom javascript-events firefox-addon

我正在编写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中的元素(但这是另一个故事)。

感谢您的帮助,谢谢大家!

3 个答案:

答案 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事件处理程序后才加载它。