微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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);

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

原文地址:https://www.jb51.cc/js/153045.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐