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