javascript – Firefox onLocationChange并不总是被调用

我正在构建一个可以创建几个隐藏的浏览器元素的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);

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...