我正在构建一个firefox扩展,它会创建几个隐藏的浏览器元素。
我想addProgressListener()
为我加载的页面处理onLocationChange。但是,我的处理程序并不总是被调用。
更具体地说,这就是我正在做的事情:
src
属性onLocationChange
的进度侦听器添加到浏览器元素loadURIWithFlags()
并发布数据我希望每次在4之后调用处理程序,但有时它不会(虽然它似乎卡在同一页面上)。
有趣的是,如果我在setTimeout(..., 5000);
内包裹3和4,它每次都有效。
我也试过改变一些步骤,但它没有任何效果。
更大的图片:当浏览器的contentDocument
是新加载的页面(重定向后)时,我希望能够得到可靠的通知。有更好的方法吗?
更新:我已经在mozilla的bug跟踪器上打开了一个错误,其中有一个显示此行为的最小xulrunner应用,以防任何人想要仔细查看:https://bugzilla.mozilla.org/show_bug.cgi?id=941414
答案 0 :(得分:4)
根据我使用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
一样。如果我更换
newBrowser.addProgressListener(listener);
与
newBrowser.addEventListener("load", function(e) {
console.log('got here! ' + e.target.contentDocument.location.href);
}, false);
然后我会收到每个browser
的通知。