我想弄清楚这里发生了什么。我已经研究了几个小时了,似乎无法理解为什么会发生这种情况。
我正在进行一些 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 相关,但我没有使用它。
好吧,经过几个小时的测试(以及 @Dave 和 @danronmoon 的精彩讨论,我终于弄清楚发生了什么。
我正在进行的 CORS(跨域资源共享)调用被设置为“async: false”——(我意识到我没有将其包含在我的原始帖子中,因为我认为这是无关紧要的)这似乎运行良好在除 Firefox 之外的所有浏览器中,jQuery 都会向您咆哮,并且您的 ajax 调用将会失败。
感谢大家的帮助,希望这对其他人有帮助!
如果您在执行 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
沙箱选项。
有趣的是,这个沙箱选项对于重新加载顶部浏览上下文来说是不是强制的……它只是在其中导航时需要的。
这是 Diogo Cardoso 的真正解决方案,xhr 对象或父对象似乎缺少 toString() 方法
是的,是使用ajax导致的CORS问题。但正如 user320550 所问,如果您需要使用属性“async:false”怎么办?我发现使用“withCredentials:false”属性作为解决方法可以修复 Firefox 上的问题,并且不会影响其他浏览器。
只是想添加 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
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"
}
}