我最近测试过我正在使用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行。没有更多信息,我甚至不知道从哪里开始寻找。
答案 0 :(得分:61)
通常,当您使用async = true调用open方法时,XMLHttpRequest会发生此错误,或者您将async参数保留为undefined,因此默认为异步,然后您可以访问status或responseText属性。这些属性仅在您执行同步调用后或readyState准备就绪时(异步调用响应时)可用。我建议你首先尝试使用async = false,然后切换到true并使用onReadyStateChange。
答案 1 :(得分:23)
在我的情况下,我在打开连接之前设置了标题。为防止出现此错误,需要在打开连接后设置标头:
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异常11消息,但我想我会在这里为下一个人发布我的解决方案。
答案 2 :(得分:9)
Chrome canary为DOM Exceptions提供堆栈跟踪!
答案 3 :(得分:5)
当Javascript尝试document.write()
进入XHTML页面(Content-Type: application/xhtml+xml
)时,也会发生这种情况。
答案 4 :(得分:4)
尝试修改value
<input type="file"
属性时也会抛出此错误
这是一项安全检查。
答案 5 :(得分:3)
首先,我真的不知道Cappucino的事情或者你想要做什么。但是在使用Qt WebKit和JavaScript对象时我已经看到了这一点。它发生在javascript窗口对象被清除之后,例如如果我在加载新页面后没有将我的本机JS对象加载到WebKit。
这基本上意味着,您正在尝试使用内部删除的JavaScript对象。
答案 6 :(得分:3)
在这种情况下,我认为问题源于尝试使用带有未完全加载的图像的图案填充将图像绘制到画布。此问题与Cappuccino issue 811有关,我的推理基于aparajita's建议,以确保在尝试将图像用作图案填充之前加载图像。
尽管如此,考虑到关键信息(被称为什么对象)并不明显,并且它可以出现的地方多种多样,这个错误令人沮丧地不透明。
答案 7 :(得分:2)
Chrome和Safari都内置了调试器。确保使用index-debug.html文件启动应用程序以便于阅读代码。
在Safari中,转到“首选项”并激活“开发人员”菜单。然后去开发&gt;开始调试JavaScript。使用左下方的暂停图标将调试器设置为在出错时暂停。下次遇到问题时,调试器将在有问题的行中暂停,并向您显示它是如何通过堆栈跟踪进行的。
答案 8 :(得分:2)
我在尝试使用input[type="file"]
属性集动态编写value
元素时发生过这种情况。
当我从我注入的内容中移除value
attr时,一切正常。
从某种意义上说,我认为这个错误意味着“你试图做一些规范不允许的事情”,基于这篇文章 - http://designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr-dom-exception.html
答案 9 :(得分:1)
这个问题对我来说是因为我使用了这样的音频API:
df0['abc'] = df0[['a','b','c']].apply(tuple, axis=1)
print (df0)
D E F a b c abc
1 1 5 a a 4 7 (a, 4, 7)
1 3 3 a b 5 8 (b, 5, 8)
2 5 6 a c 4 9 (c, 4, 9)
2 7 9 b d 5 4 (d, 5, 4)
9 1 2 b e 5 2 (e, 5, 2)
10 0 4 b f 4 3 (f, 4, 3)
但这不正确,因为play()函数是异步的。相反,您需要使用返回的Promise的then函数。
let someAudio = new Audio(file);
someAudio.play();
someAudio.pause();
返回值:在播放开始时满足的承诺,或者因任何原因无法启动播放而被拒绝的承诺。 MDN
答案 10 :(得分:0)