Firefox扩展程序。如何捕获onload事件?

8

我有一个Firefox的可脚本化扩展,它是用JavaScript编写的网络爬虫。

我的目标是:

加载一个网页,然后执行一些操作,再跳转到另一个页面(使用从已加载的页面获取的URL)。当新页面加载完成后,爬虫会执行相同的操作。

算法大致如下:

  1. 等待页面加载完成
  2. 执行一些操作
  3. 选择不同的URL
  4. 跳转到该URL
  5. 返回步骤1

在我的主函数中,我使用以下代码:

gBrowser.addEventListener("DOMContentLoaded",haXahv8, false); 

在我跳转到另一个页面之前,一切都很正常...如何在我的火狐扩展中重用DOMContentLoaded事件?

因此,问题是:

是否可以在Firefox扩展中为不同的页面重用load/DOMContentLoaded事件?如果可以,如何实现?

p.s. 以前我用Windows Forms和WebBrowser + C++解决这个问题...哦,那时候时间过得真快啊...梦想!因为一切都很顺利=)

2个回答

12

您只需要注册一次活动,每次浏览器标签触发时都应该收到它。

只要您等待XUL窗口触发load事件后再向gBrowser元素添加事件侦听器,您的代码就可以正常工作。如果在此之前添加事件侦听器,则gBrowser尚未初始化,行为是未定义的。

以下是一个示例:

window.addEventListener('load', function () {
    gBrowser.addEventListener('DOMContentLoaded', function () {
        // stuff that happens for each web page load goes here
    }, false);
}, false);

请注意,实际上我只能确保这在Firefox 3.5及以上版本中有效。我编写了一个扩展(在我的公司内部),可以可靠地为Firefox 1.5到3.5执行此类操作,但不幸的是它比上面的解决方案更加复杂,但幸运的是更加健壮。如果您需要支持超过Firefox 3.5+,请让我知道,我会提供更多信息。
以下是一些额外的阅读材料:

3

addEventListener()方法的最后一个参数在您的情况下设置为“false”,需要将其设置为true,这告诉浏览器每次事件发生时都要触发您的事件处理程序。

当前值false表示它只会在事件第一次发生时触发您的处理程序。

希望我能为您节省一些时间,在W3C.org的文档对象模型事件页面上搜索了相当长的时间!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接