我正在构建一个可以创建几个隐藏的浏览器元素的Firefox扩展.
我想addProgressListener()来处理我加载的页面的onLocationChange.但是,我的处理程序并不总是被调用.
更具体地说,这是我在做什么:
>创建浏览器元素,而不设置其src属性
>将其附加到另一个元素
>添加一个进度监听器,监听onLocationChange到浏览器元素
>使用所需的URL和post数据调用loadURIWithFlags()
我期望在4之后每次调用处理程序,但有时它不会(似乎被困在同一页面上).
有趣的是,如果我将3和4包在一个setTimeout(…,5000)中;它每次都工作.
我也尝试洗牌一些步骤,但没有任何影响.
更大的图景:当浏览器的contentDocument是新加载的页面(重定向后)时,我想被可靠地通知.有没有更好的方法来做到这一点?
更新:我已经开发了一个bug的mozilla的bug跟踪器与一个最小的xulrunner应用程序显示这种行为,以防任何人想要仔细观察: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);
,您的浏览器可能还没有准备好.当你添加延迟时,事情有时间初始化,所以他们工作正常.此外,当您做动态创建浏览器元素时,您可能会做的事情很少有人尝试过.换句话说,这听起来像是Firefox中的一个bug,也可能是一个不太受关注的bug.
您说您正在使用onLocationChange,以便您可以知道何时添加负载侦听器.自从你提到之后,我会猜测你正在将内容加载器添加到contentDocument中.您可以做的是将负载侦听器添加到浏览器本身,就像使用iframe一样.如果我更换
newBrowser.addProgressListener(listener);
同
newBrowser.addEventListener("load",function(e) { console.log('got here! ' + e.target.contentDocument.location.href); },false);
然后我收到每个浏览器的通知.