2011-03-16 53 views
3

我正在写一个Firefox扩展,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扩展,我们可以用“run_at”:在“的manifest.json”“document_start”, 和Safari扩展,我们可以在扩展生成器中使用“启动脚本” 但在Firefox中......我不知道如何做同样的伎俩。

我需要这个开始看DOM中的元素,一旦他们到达(但那是另一个故事)。

我感谢任何帮助,谢谢大家!

回答

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'));调试,看看各浏览器将一个空元素以同样的方式。

+0

让我来试试! – developerGuile 2011-03-16 19:01:59

+0

appcontent是从一开始就有的,所以这里的时间间隔没有帮助。问题是我需要检测开始加载的文档,所以我可以等待它的元素。事情是,我通过appcontent.addEventListener捕获的事件访问文档,并且该事件由“来自”的“加载”事件触发。 – developerGuile 2011-03-16 19:15:46

+0

那么,'appcontent'是你的扩展中的一个元素?而当你说文档时,你指的是你将用内容脚本方法影响的目标网页? (抱歉的术语,我通常是一个铬开发人员)。 如果是这种情况......您可以用js中的'appcontent'替换文档中的目标元素吗?然后让间隔坐下来等着呢? – 2011-03-16 19:27:43

0

您是否将您的appcontent元素的src设置为XUL源代码中的属性?这使得事情变得诡计多端,因为XUL不喜欢你在加载时访问元素。你可以尝试的是添加派生XBL绑定到元素,并在那里定义捕获事件处理程序。或者您可能会发现DOMContentLoaded事件足够早。否则,我会建议将appcontent元素留空,只有在主窗口的加载事件处理程序中添加了加载事件处理程序后才加载它。

+0

我对appcontent所做的唯一工作是附加eventListener,以便捕获加载事件。 – developerGuile 2011-03-18 15:41:22

+0

我想使用ProgressListener,所以我可以在URL更改后立即开始处理。 'Components.interfaces.nsIWebProgressListener' – developerGuile 2011-03-18 15:42:55

3

有一个很好的解释在这里:

http://blog.webmynd.com/2011/04/04/equivalent-to-beforeload-event-for-firefox-extensions/

建议的解决方案依赖于Firefox的观察员和HTTP-ON-修改请求:

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);