我正在试图弄清楚这里发生了什么。我已经在这几个小时了,似乎无法控制为什么会发生这种情况。
我正在进行一些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有关,我没有使用它。
答案 0 :(得分:30)
好的,经过几个小时的测试(以及@Dave和@danronmoon的精彩讨论,我终于弄清楚发生了什么。
我正在制作的CORS(跨域资源共享)调用被设置为'async:false' - (我意识到我没有包含在我的原始帖子中,因为我认为这是无关紧要的)这个,似乎除了Firefox之外,所有浏览器都可以正常运行,jQuery会咆哮你,你的ajax调用将失败。
谢谢大家的帮助,我希望这有助于其他人!
答案 1 :(得分:2)
这是Diogo Cardoso的真正解决方案,xhr对象或父类似乎缺少toString()方法
答案 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秒钟才能认为用户交互已过期。
可能的解决方案:
allow-top-navigation
选项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"
}
}