38

我最近测试了我正在使用 Chrome 和 Safari 开发的 Cappuccino 应用程序。我得到错误:

INVALID_STATE_ERR: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.

缺乏信息令人沮丧。什么对象以及我在哪里尝试使用它?Chrome 试图回答第二个问题,但它给出的行号 465 并不意味着它给出的文件只有 94 行长。没有更多信息,我什至不知道从哪里开始寻找。

4

11 回答 11

63

通常,当您使用 async = true 调用 open 方法时,XMLHttpRequest 会发生此错误,或者您未定义 async 参数以使其默认为异步,然后您访问 status 或 responseText 属性。这些属性仅在您进行同步调用后可用,或者在 readyState 准备就绪时可用(一旦异步调用响应)。我建议你先尝试使用 async = false,然后切换到它为 true 并使用 onReadyStateChange。

于 2011-03-16T00:24:00.683 回答
24

就我而言,我在打开连接之前设置了标题。为防止出现此错误,需要在打开连接后设置标头:

var fd = new FormData();
fd.append("fileToUpload", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", postUrl, true);
xhr.setRequestHeader("cache-control", "no-cache");
xhr.send(fd);

我知道这个答案是针对我的问题的,而不是通用的 INVALID_STATE_ERR: DOM Exception 11 消息,但我想我会在这里为下一个人发布我的解决方案。

于 2012-12-07T14:39:31.777 回答
8

Chrome canary 为 DOM 异常提供堆栈跟踪!

于 2012-06-16T22:45:43.807 回答
5

document.write()当 Javascript 尝试进入 XHTML 页面 ( Content-Type: application/xhtml+xml)时,也会发生这种情况。

于 2012-05-09T16:26:09.993 回答
4

This error is also thrown when attempting to modify the value property of a <input type="file"

This is a security check.

于 2013-02-02T12:44:15.380 回答
3

在这种情况下,我认为问题源于尝试使用未完全加载的图像填充图案将图像绘制到画布上。这个问题与卡布奇诺问题 811有关,我的推理基于aparajita 的建议,以确保在尝试将图像用作图案填充之前加载图像。

尽管如此,考虑到关键信息(对象被称为什么)并不明显,并且它可能出现的位置多种多样,这个错误令人沮丧地不透明。

于 2011-04-02T20:44:32.057 回答
3

首先,我真的不知道卡布奇诺的事情或你想要做什么。但是我在使用 Qt WebKit 和 JavaScript 对象时已经看到了这一点。它发生在清除 javascript 窗口对象之后,例如,如果在加载新页面后我没有将本机 JS 对象加载到 WebKit。

这基本上意味着,您正在尝试使用内部删除的 JavaScript 对象。

于 2010-08-15T18:51:07.897 回答
2

Chrome 和 Safari 都内置了调试器。确保您使用 index-debug.html 文件来启动您的应用程序以获得易于阅读的代码。

在 Safari 中,转到首选项并激活开发人员菜单。然后转到开发 > 开始调试 JavaScript。使用左下角的暂停图标将调试器设置为暂停错误。下次遇到问题时,调试器将在有问题的行处暂停,并向您展示它是如何通过堆栈跟踪到达那里的。

于 2010-08-15T20:26:14.970 回答
2

我在尝试动态编写具有属性集的input[type="file"]元素时看到了这种情况。value

当我value从我注入的东西中删除 attr 时,它一切正常。

从某种意义上说,我认为这个错误的意思是“你试图做一些规范不允许的事情”,基于这里的这篇文章——http: //designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr-dom-exception .html

于 2013-02-15T19:14:23.987 回答
1

这个问题发生在我身上,因为我使用了这样的音频 API:

let someAudio = new Audio(file);
someAudio.play();
someAudio.pause();

但这是不正确的,因为 play() 函数是异步的。相反,您需要使用返回的 Promise 的 then 函数。

someAudio.play().then(() => someAudio.pause());

返回值:一个 Promise,在播放开始时完成,或者如果由于任何原因无法开始播放,则被拒绝。 MDN

于 2017-11-05T21:10:38.570 回答
0

我想补充一点。使用股票浏览器在三星 S4 和 S5 上遇到了这个错误。

就我而言,这是由于尝试播放尚未加载的音频文件引起的。

这个 SO Question 涵盖了同样的问题: DOM Exception 11

于 2016-07-30T11:19:01.567 回答