Javascript Firefox onLocationChange不总是调用

Javascript Firefox onLocationChange不总是调用,javascript,firefox,firefox-addon,settimeout,xul,Javascript,Firefox,Firefox Addon,Settimeout,Xul,我正在构建一个firefox扩展,它创建了几个隐藏的浏览器元素 我想addProgressListener()为我加载的页面处理onLocationChange。但是,我的处理程序并不总是被调用 更具体地说,我是这样做的: 创建浏览器元素,而不设置其src属性 将其附加到另一个元素 将侦听onLocationChange的进度侦听器添加到浏览器元素 使用所需的url和post数据调用loadURIWithFlags() 我希望每次在4之后都会调用处理程序,但有时不会(但似乎卡在了同一页上) 有趣

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

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

更具体地说,我是这样做的:

  • 创建浏览器元素,而不设置其
    src
    属性
  • 将其附加到另一个元素
  • 将侦听
    onLocationChange
    的进度侦听器添加到浏览器元素
  • 使用所需的url和post数据调用
    loadURIWithFlags()
  • 我希望每次在4之后都会调用处理程序,但有时不会(但似乎卡在了同一页上)

    有趣的是,如果我将3和4包装在
    setTimeout(…,5000)中每次都有效

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

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


    更新:我在mozilla的bug跟踪器上打开了一个bug,一个最小的xulrunner应用程序显示了这种行为,以防有人想仔细看看:

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

    var newBrowser = window.document.createElement('browser');
    newBrowser.setAttribute('flex', '1');
    newBrowser.setAttribute('type', 'content');
    cacheFrame.insertBefore(newBrowser, null);
    
    ,您的
    浏览器可能还没有准备好。当您添加延迟时,事情有时间初始化,因此它们工作正常。此外,当您执行诸如动态创建
    浏览器
    元素之类的操作时,您可能正在执行以前很少有人尝试过的操作。换句话说,这听起来像Firefox中的一个bug,可能不会引起太多关注

    您说您正在使用
    onLocationChange
    ,以便知道何时添加
    load
    侦听器。我猜您是在将
    load
    侦听器添加到
    contentDocument
    中,因为您提到了它。相反,您可以将
    加载
    侦听器添加到
    浏览器
    本身,就像使用
    iframe
    一样。如果我替换

    newBrowser.addProgressListener(listener);
    


    然后我会收到每个
    浏览器的通知

    我们能得到一些代码/小提琴吗?您如何设置侦听器?@Cracker0dks该bug附带了一个最小的xulrunner应用程序:我知道这是一个简化的测试用例,但您想实现什么?为什么要使用onLocationChange而不是简单的加载侦听器?为什么是一个而不是一个或甚至是一个XmlHttpRequest?实际上我这样做是为了能够监听
    load
    事件。首次创建浏览器元素时,其
    contentDocument
    未指向右侧页面(它指向的是about:blank)。只有在启动了
    onLocationChange
    之后,
    contentDocument
    才会更新为指向新页面(或者至少这是我能找到的最早页面)。抱歉,忘了回复您声明的第二部分。我需要它是一个浏览器元素,因为我需要它的行为就像用户访问站点一样,包括执行javascript。一些网站通过防止被iframe’d来防止点击劫持,XmlHttpRequest不会“执行”页面。我需要这个可靠的工作为所有网站。谢谢你的回答。不幸的是,newBrowser.addEventListener('load',f)不起作用-f从未被调用。我还尝试在我的应用程序开始时立即创建一组浏览器,稍后将侦听器绑定到它们,以避免异步问题。这不起作用,这让我觉得这不是一个“浏览器准备就绪”的问题。发生的另一件非常奇怪的事情是,如果我在setTimeout中包含对listener变量的赋值,那么它同样不起作用!如果实际使用的是
    newBrowser.addEventListener('load',f)
    ,则缺少最后一个参数。我用你的代码试过了,它对我有效。如果没有,那么发布你的新代码,我们可以看到结果。啊哈,这个参数应该是真的(默认为假)。谢谢
    newBrowser.addEventListener("load", function(e) {
      console.log('got here! ' + e.target.contentDocument.location.href);
    }, false);