gpt4 book ai didi

javascript - Firefox onLocationChange 并不总是被调用

转载 作者:可可西里 更新时间:2023-11-01 02:45:45 26 4
gpt4 key购买 nike

我正在构建一个 firefox 扩展,它创建了几个隐藏的浏览器元素。

我想 addProgressListener() 来处理我加载的页面的 onLocationChange。但是,我的处理程序并不总是被调用。

更具体地说,这是我正在做的:

  1. 创建一个浏览器元素,不设置其 src 属性
  2. 将它附加到另一个元素
  3. 为浏览器元素添加一个监听 onLocationChange 的进度监听器
  4. 使用所需的 url 和 post 数据调用 loadURIWithFlags()

我希望每次在 4 之后调用处理程序,但有时它不会(尽管它似乎卡在相同的页面上)。

有趣的是,如果我将 3 和 4 包装在 setTimeout(..., 5000); 中,它每次都有效。

我也试过改组一些步骤,但没有任何效果。

大图:当浏览器的 contentDocument 是新加载的页面(重定向后)时,我希望得到可靠的通知。有更好的方法吗?

更新:我已经在 mozilla 的错误跟踪器上打开了一个错误,其中包含一个显示此行为的最小 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);

,您的浏览器可能还没有准备好。当您添加延迟时,事物有时间进行初始化,因此它们可以正常工作。此外,当您执行诸如动态创建 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);

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

关于javascript - Firefox onLocationChange 并不总是被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20107546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com