我正在构建一个firefox扩展,该扩展创建了几个隐藏的浏览器元素。

我想addProgressListener()处理加载的页面的onLocationChange。但是,我的处理程序并不总是被调用。

更具体地说,这是我在做什么:

  • 创建浏览器元素,而不设置其src属性
  • 附加到另一个元素
  • 向浏览器元素
  • 添加一个侦听onLocationChange的进度侦听器
  • 使用所需的URL调用loadURIWithFlags()并发布数据

  • 我希望处理程序每​​次在4之后都被调用,但有时却不会(尽管似乎卡在了同一页上)。

    有趣的是,如果我将3和4包裹在setTimeout(..., 5000);中,则每次都可以使用。

    我也尝试过改组一些步骤,但是没有任何效果。

    更大的图景:当浏览器的contentDocument是新加载的页面的ojit_code(重定向之后)时,我想得到可靠的通知。有一个更好的方法吗?

    更新:从那时起,我已经使用最小的xulrunner应用程序在mozilla的错误跟踪器上打开了一个错误,此错误可显示此行为,以防万一有人想近距离观察:https://bugzilla.mozilla.org/show_bug.cgi?id=941414

    最佳答案

    在使用Firefox进行开发的经验中,我发现在某些情况下,各种元素的初始化代码就像是异步的。换句话说,当您完成执行后

    var newBrowser = window.document.createElement('browser');
    newBrowser.setAttribute('flex', '1');
    newBrowser.setAttribute('type', 'content');
    cacheFrame.insertBefore(newBrowser, null);
    

    ,您的browser可能实际上尚未准备好。当您添加延迟时,事情有时间初始化,因此它们可以正常工作。另外,当您执行诸如动态创建browser元素之类的操作时,您可能会做很少有人尝试过的操作。换句话说,这听起来像是Firefox中的错误,并且可能不会引起太多关注。

    您说您正在使用onLocationChange,以便可以知道何时添加load侦听器。我猜想自从您提到load以来,您正在将contentDocument侦听器添加到load中。相反,您可以做的是将browser侦听器添加到iframe本身,就像使用browser一样。如果我更换
    newBrowser.addProgressListener(listener);
    


    newBrowser.addEventListener("load", function(e) {
      console.log('got here! ' + e.target.contentDocument.location.href);
    }, false);
    

    然后我收到每个ojit_code的通知。

    07-27 15:50