Firefox onLocationChange并不总是被调用

Ser*_*rca 10 javascript firefox xul firefox-addon settimeout

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

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

更具体地说,这就是我正在做的事情:

  1. 创建一个浏览器元素,而不设置其src属性
  2. 将它附加到另一个元素
  3. 添加一个侦听onLocationChange浏览器元素的进度监听器
  4. loadURIWithFlags()使用所需的网址调用并发布数据

我希望每次在4之后调用处理程序,但有时它不会(虽然它似乎卡在同一页面上).

有趣的是,如果我将3和4包裹在内部,setTimeout(..., 5000);它每次都有效.

我也试过改变一些步骤,但它没有任何效果.

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

更新:我已经在mozilla的bug跟踪器上打开了一个错误,其中有一个显示此行为的最小xulrunner应用程序,以防任何人想要仔细查看:https://bugzilla.mozilla.org/show_bug.cgi?id = 941414

Jas*_*abe 4

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

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

,你browser可能还没有真正准备好。当您添加延迟时,事物有时间进行初始化,因此它们可以正常工作。此外,当您执行动态创建browser元素之类的操作时,您可能会执行以前很少有人尝试过的操作。换句话说,这听起来像是 Firefox 中的一个错误,而且可能不会引起太多关注。

您说您正在使用onLocationChange以便您可以知道何时添加load侦听器。我猜你正在将load侦听器添加到 中,contentDocument因为你提到了它。相反,您可以做的是将load侦听器添加到其browser自身,就像使用iframe. 如果我更换

newBrowser.addProgressListener(listener);
Run Code Online (Sandbox Code Playgroud)

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

然后我会收到每个的通知browser