Evil Firefox错误 - “底层对象不支持参数或操作”

时间:2013-05-21 19:24:11

标签: javascript jquery firefox cors

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

我正在进行一些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有关,我没有使用它。

6 个答案:

答案 0 :(得分:30)

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

我正在制作的CORS(跨域资源共享)调用被设置为'async:false' - (我意识到我没有包含在我的原始帖子中,因为我认为这是无关紧要的)这个,似乎除了Firefox之外,所有浏览器都可以正常运行,jQuery会咆哮你,你的ajax调用将失败。

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

答案 1 :(得分:2)

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

CORS synchronous requests not working in firefox

答案 2 :(得分:2)

对我来说,我使用的是WebSockets,叫做WebSocket.close(1001)。它不喜欢我的status code。将其更改为1000或不指定代码(默认为1005)都可以。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

如果您在执行iframe /窗口操作时遇到此类错误,那么即使位于同一原点,iframe的sandbox属性(请参见https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-sandbox)也可能会阻止您这样做。

在我的情况下,iframe尝试在表单提交成功后执行window.top.location.href = ...。必须使用allow-top-navigation沙箱选项。 有趣的是,对于重新加载顶部浏览上下文,此沙盒选项不是必需的...仅在其中导航时才需要。

答案 5 :(得分:0)

只想添加Xenos答案的某种令人讨厌的间歇性变体。正如他提到的,如果您尝试通过在沙盒iframe中设置window.top.location.href = ...来导航窗口,就会遇到此问题,如果您的iframe设置了allow-top-navigation选项,则可以避免这种情况。

但是您可能还会发现iframe的限制更为严格allow-top-navigation-by-user-activation option。这将允许导航,但是仅响应于用户操作(例如单击链接或按钮)。例如,将在表单提交事件处理程序中允许它,但是您不能仅在任意时间点触发它,例如从setTimeout()回调中延迟很长时间。

例如,如果您在执行重定向之前使用AJAX表单提交,则可能会出现问题。浏览器需要确定导航是否响应用户的操作。通过仅在被认为在用户交互的可接受时间段内发生导航的情况下,它才允许导航。 HTML标准将此称为transient activation

最重要的是,如果您的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"
    }
}