【问题标题】:INVALID_STATE_ERR: DOM Exception 11 (WebKit)INVALID_STATE_ERR:DOM 异常 11 (WebKit)
【发布时间】:2011-03-30 03:46:08
【问题描述】:

我最近测试了我正在使用 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 行长。如果没有更多信息,我什至不知道从哪里开始寻找。

【问题讨论】:

    标签: javascript dom webkit cappuccino


    【解决方案1】:

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

    【讨论】:

    • 谢谢哥们...我已经愤怒地专注于这个一个小时了。
    • 如果你想要的话,使用 onLoad 代替 onReadyStateChange。并且 status 和 responseText 实际上在 HEADERS_RECIEVED 状态下也可用,因此如果您需要,它们可以尽早使用。
    • 戴夫,你也许可以帮助我解决我的问题。我尝试将异步设置为 false,Chrome 停止给我错误,但它甚至没有向服务器发出请求。我的代码在 Firefox 中运行良好。 stackoverflow.com/q/14540418/371273
    • async = false 已被弃用(浏览器供应商讨厌它,他们会尝试删除它)。我建议不要使用它,至少不要用于临时调试。
    【解决方案2】:

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

    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 消息,但我想我会在这里为下一个人发布我的解决方案。

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 是的,XHTML 不行,HTML 可以!非常感谢。
    【解决方案5】:

    尝试修改<input type="file"value 属性时也会引发此错误

    这是一个安全检查。

    【讨论】:

    • 您能否更专注于您的答案?因为我面临<input type="file"/>jquery.1.7.1.min.js 的问题。非常感谢您的宝贵回复:)
    • 出于明显的安全目的,您不能在 JavaScript 中修改 file 输入字段的 value 字段。否则,这将允许任何脚本将随机文件从用户计算机上传到他们的服务器,而无需对用户部分进行任何操作。因此,当尝试更新属性时,浏览器会抛出异常。
    • 实际上我什至无法在单击浏览按钮时打开文件打开对话框。
    • 可以为 设置的唯一允许值是 null。即使未定义也会导致此异常。
    • 那么有什么解决办法吗?
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 你有没有遇到过这个问题?最难的部分是调试器不提供通常的信息。
        【解决方案9】:

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

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

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

        【讨论】:

          【解决方案10】:

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

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

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

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

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

          【讨论】:

            【解决方案11】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多