邪恶的 Firefox 错误——“底层对象不支持参数或操作”

问题描述 投票:0回答:6

我想弄清楚这里发生了什么。我已经研究了几个小时了,似乎无法理解为什么会发生这种情况。

我正在进行一些 AJAX 调用,但仅在 Mac OS X 上的 Firefox(版本 21)中不断收到此错误。

这是错误:

 "[Exception... "A parameter or an operation is not supported by the underlying object" 
   code: "15" nsresult: "0x8053000f (InvalidAccessError)"  location: 
   "https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js Line: 6"

我正在进行 CORS 调用,因此我像这样设置 AJAX:

$.ajaxSetup({
        crossDomain: true,
        xhrFields: {
            withCredentials: true
        }

    });

此后继续致电。基本上,有人有过这个错误的经验吗?我在网上看到一些帖子,但它们似乎都与跨域 CSS 相关,但我没有使用它。

javascript jquery firefox cors
6个回答
35
投票

好吧,经过几个小时的测试(以及 @Dave 和 @danronmoon 的精彩讨论,我终于弄清楚发生了什么。

我正在进行的 CORS(跨域资源共享)调用被设置为“async: false”——(我意识到我没有将其包含在我的原始帖子中,因为我认为这是无关紧要的)这似乎运行良好在除 Firefox 之外的所有浏览器中,jQuery 都会向您咆哮,并且您的 ajax 调用将会失败。

感谢大家的帮助,希望这对其他人有帮助!


6
投票

如果您在执行 iframe/window 操作时遇到“底层对象不支持参数或操作”错误,那么您可能会被 iframe 的

sandbox
属性阻止(请参阅 https://html.spec .whatwg.org/multipage/iframe-embed-object.html#attr-iframe-sandbox )即使位于同一原点。

就我而言,在表单提交成功后,

iframe
尝试执行
window.top.location.href = ...
。为此,必须使用
allow-top-navigation
沙箱选项。

有趣的是,这个沙箱选项对于重新加载顶部浏览上下文来说是不是强制的……它只是在其中导航时需要的。


5
投票

对我来说,我使用的是 WebSockets 并称为

WebSocket.close(1001)
。它不喜欢我的状态代码。将其更改为
1000
或不指定代码(默认
1005
)就可以了。


2
投票

这是 Diogo Cardoso 的真正解决方案,xhr 对象或父对象似乎缺少 toString() 方法

CORS 同步请求在 Firefox 中不起作用


2
投票

是的,是使用ajax导致的CORS问题。但正如 user320550 所问,如果您需要使用属性“async:false”怎么办?我发现使用“withCredentials:false”属性作为解决方法可以修复 Firefox 上的问题,并且不会影响其他浏览器。


0
投票

只是想添加 Xenos 答案的一个有点令人讨厌的间歇性变体。正如他提到的,如果您尝试通过在沙盒 iframe 中设置

window.top.location.href = ...
来导航窗口,您可能会遇到此问题,并且如果您的 iframe 设置了
allow-top-navigation
选项,则可以避免这种情况。

但您可能还会发现您的 iframe 具有更多限制性

allow-top-navigation-by-user-activation
选项。这将允许导航,但仅响应用户操作,例如单击链接或按钮。例如,在表单提交事件处理程序中允许这样做,但您不能在任意时间点触发它,例如从具有较长延迟的 setTimeout() 回调中触发。

如果您(例如)在执行重定向之前使用 AJAX 表单提交,这可能会出现问题。浏览器需要决定导航是否响应用户操作。它通过仅允许导航被认为是在用户交互的“可接受”时间段内发生来实现这一点。 HTML 标准将此称为“瞬时激活”。 底线是,如果您的 AJAX 调用太慢,或者您的用户网络连接较差,导航将会失败。慢到什么程度算太慢?我只测试了 Firefox,但它似乎需要 5 秒才认为用户交互已过期。

可能的解决方案:

要求负责 iframe 选项的人升级到毯子

allow-top-navigation

选项
  • 不要在用户操作和顶部导航之间执行异步工作,例如 AJAX 请求。例如,使用老式的 POST 表单直接提交到后端,而不是使用 AJAX 请求
    确保您的回复尽可能快。捕获任何错误,并提示用户单击某项以手动触发导航。例如:
  • async function submitForm() { await doPotentiallySlowAsyncFormSubmit() try { window.top.location.href = ... } catch (e) { // Show message to user, e.g. "Form submitted, click here to go to the next step" } }
© www.soinside.com 2019 - 2024. All rights reserved.