Evil Firefox 错误——“底层对象不支持参数或操作”
Posted
技术标签:
【中文标题】Evil Firefox 错误——“底层对象不支持参数或操作”【英文标题】:Evil Firefox Error -- "A parameter or an operation is not supported by the underlying object" 【发布时间】:2013-05-16 16:27:42 【问题描述】:我试图弄清楚这里发生了什么。我已经研究了好几个小时了,但似乎无法理解为什么会发生这种情况。
我进行了几次 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 有关。
【问题讨论】:
那么您已经在其他浏览器/操作系统上进行了测试?它们都有效吗? 是的。所有其他浏览器(包括 Windows 上的 Firefox)都可以使用。快把我逼疯了! 此外,它会冻结并崩溃整个浏览器(但我认为这是因为它多次发生) @danronmoon 我刚刚尝试了未缩小的版本,错误发生在 jquery 的第 7717 行。很难调试,因为它出错时会导致我的整个浏览器崩溃。 您确定xhrFields
中没有其他内容吗? withCredentials
肯定拼写正确?错误消息和行号意味着xhrFields
中的某些内容不是可以在XMLHttpRequest
对象上设置的属性...
【参考方案1】:
好的,经过数小时的测试(以及来自@Dave 和@danronmoon 的精彩讨论,我终于弄清楚发生了什么。
我进行的 CORS(跨域资源共享)调用被设置为“async: false”——(我意识到我没有将其包含在我的原始帖子中,因为我认为这无关紧要)这似乎在除 Firefox 之外的所有浏览器中都可以正常运行,在这些浏览器中,jQuery 会向您咆哮并且您的 ajax 调用将失败。
感谢大家的帮助,我希望这对其他人有所帮助!
【讨论】:
非常感谢!!在过去的几天里,这个问题让我发疯了。我现在可以把它从我的清单上划掉! @EvanM 没问题!我很高兴这对其他人有所帮助! 谢谢一百万。已经为此苦苦挣扎了一段时间。 好的,如果我想使用 async:false 怎么办?为什么FF有这个问题?有没有人找到需要将 async 设置为 false 的解决方法? 这不是 FF 的真正问题——这是一个 CORS 问题,而 FF 似乎是唯一严格执行它的问题。所有 CORS 调用都必须是异步的(至少在我的研究中)。【参考方案2】:由于这是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
沙盒选项是强制性的。
有趣的是,这个沙盒选项不是强制重新加载顶部浏览上下文......它只是在其中导航时需要的。
【讨论】:
或者您的资源在Content-Security-Policy
标头中应用了沙盒属性。
我为这种更具体的情况添加了另一个答案,如果设置了更具限制性的allow-top-navigation-by-user-activation
选项并完成异步工作(例如 AJAX)以响应用户交互。【参考方案3】:
对我来说,我使用的是WebSockets 并调用了WebSocket.close(1001)
。它不喜欢我的status code。将其更改为 1000
或不指定代码(默认为 1005
)就可以了。
【讨论】:
在此处查看 CloseEvent 代码列表:developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code(特别注意:0–999 Reserved and not used
。)【参考方案4】:
这是 Diogo Cardoso 的真正解决方案,xhr 对象或父对象似乎缺少 toString() 方法
CORS synchronous requests not working in firefox
【讨论】:
我看到你在 FF 最初指出的问题,但让所有 CORS 异步仍然是最佳实践(并且在 CORS 规范内) - 我相信这个(或类似的)问题将继续出现如果程序员继续违反 CORS 规范。感谢您加入对话,顺便说一句!【参考方案5】:是的,这是使用ajax引起的CORS问题。但正如 user320550 所问,如果您需要使用属性“async:false”怎么办?我发现使用 'withCredentials:false' 属性作为解决方法可以解决 firefox 上的问题,并且不会影响其他浏览器。
【讨论】:
【参考方案6】:只是想添加一个有点讨厌的 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"
【讨论】:
以上是关于Evil Firefox 错误——“底层对象不支持参数或操作”的主要内容,如果未能解决你的问题,请参考以下文章
Book of Evil CodeForces - 337D