30

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

我正在进行一些 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 有关。

4

6 回答 6

33

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

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

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

于 2013-05-23T12:25:34.547 回答
6

由于这是第一个duckduckgo 结果,InvalidAccessError: A parameter or an operation is not supported by the underlying object我将为此添加另一个来源。

如果您在执行 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有趣的是,这个沙盒选项对于重新加载顶部浏览上下文不是强制性的……它只是在其中导航时需要的。

于 2019-06-07T16:43:12.223 回答
4

对我来说,我使用的是WebSockets并调用了WebSocket.close(1001). 它不喜欢我的状态码。将其更改为1000或不指定代码(默认1005)就可以了。

于 2020-07-07T04:07:56.420 回答
2

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

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

于 2014-07-30T13:44:59.807 回答
2

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

于 2016-04-18T20:55:29.647 回答
0

只是想添加一个有点讨厌的 Xenos 答案的间歇性变体。正如他所提到的,如果您尝试通过在沙盒 iframe 中进行设置来导航窗口,则可能会遇到此问题,并且如果您的 iframe设置了选项window.top.location.href = ...,则可以防止这种情况发生。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"
    }
}
于 2020-11-18T23:49:38.833 回答