INVALID_STATE_ERR:DOM例外11(WebKit)
我最近testing了一个我正在使用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行时,并不意味着什么。 没有更多的信息,我甚至不知道从哪里开始寻找。
铬金丝雀为DOM例外提供堆栈跟踪!
当您使用async = true调用open方法时,通常会出现XMLHttpRequest错误,或者您将async参数设置为undefined,所以它默认为asynchronous,然后访问status或responseText属性。 这些属性只有在进行同步调用后才能使用,或者readyState准备就绪(一旦asynchronous调用响应)。 我build议你先尝试一下async = false,然后切换到true,并使用onReadyStateChange。
在我的情况下,我打开连接之前设置标题。 为了避免这个错误,打开连接后需要设置标题:
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消息,但我想我会在这里发布我的解决scheme为下一个人。
当Javascript尝试将document.write()
放入XHTML页面( Content-Type: application/xhtml+xml
)时,也会发生这种情况。
首先,我不是真的了解Cappucino的事情,也不知道你想做什么。 但是我在使用Qt WebKit和JavaScript对象时看到了这一点。 它发生在JavaScript窗口对象被清除后,例如,如果我没有加载新的页面加载后我的本地JS对象加载到WebKit。
这基本上意味着,你正试图使用内部删除的JavaScript对象。
在这种情况下,我相信这个问题是由于尝试使用未填满图像的图案填充来将图像绘制到canvas上。 这个问题与卡布奇诺问题811有关 ,我的推理是基于aparajita的build议,以确保在尝试将图像用作图案填充之前加载图像。
尽pipe如此,考虑到关键信息(称为什么对象)并不明显,而且它可能出现的位置各不相同,这个错误令人沮丧地不透明。
尝试修改<input type="file"
的value
属性时也会引发此错误
这是一个安全检查。
Chrome和Safari都内置了debugging器。 确保使用index-debug.html文件来启动应用程序,以便读取代码。
在Safari中,转到“首选项”并激活“开发者”菜单。 然后去开发>开始debuggingJavaScript。 使用左下方的暂停图标将debugging器设置为在错误时暂停。 下一次出现问题时,debugging器会在违规行中暂停,并告诉你如何通过堆栈跟踪到达目的地。
我已经看到这种情况发生时,试图dynamic地写入一个input[type="file"]
元素的value
属性设置。
当我从注射它的所有工作中删除value
attr。
从某种意义上说,我认为这个错误的含义是“你试图做一些规范不允许的事情”,根据这篇文章 – http://designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr-dom-exception html的
我想补充一点。 在使用股票浏览器的三星S4和S5上得到这个错误。
在我这边是因为试图播放尚未加载的audio文件而引起的。
这个SO问题涵盖了同样的问题: DOM Exception 11
这个问题发生在我身上,因为我使用了如下的Audio API:
let someAudio = new Audio(file); someAudio.play(); someAudio.pause();
但是这是不正确的,因为play()函数是asynchronous的。 相反,你需要使用返回的Promise的then函数。
someAudio.play().then(() => someAudio.pause());
返回值:开始播放时实现的Promise,如果由于某种原因被拒绝,则无法开始播放。 MDN