INVALID_STATE_ERR: DOM Exception 11 (WebKit)

Недавно я тестировал приложение Cappuccino, над которым я работал с Chrome и Safari. Я получаю ошибку:

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 строки. Без дополнительной информации я даже не знаю, с чего начать.

11 ответов

Решение

Chrome канарейка предлагает трассировки стека для исключений DOM!

Обычно эта ошибка возникает с XMLHttpRequest, когда вы вызываете метод open с async = true или оставляете параметр async неопределенным, чтобы он по умолчанию был асинхронным, а затем вы получаете доступ к свойствам status или responseText. Эти свойства доступны только после выполнения синхронного вызова или при готовности ReadyState (после ответа асинхронного вызова). Я предлагаю вам сначала попробовать 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, но я решил опубликовать свое решение здесь для следующего человека.

Это также может произойти, когда Javascript пытается document.write() на страницу XHTML (Content-Type: application/xhtml+xml).

Эта ошибка также выдается при попытке изменить value свойство <input type="file"

Это проверка безопасности.

Во-первых, я не знаю ничего о капучино или о том, что вы пытаетесь сделать. Но я видел это при работе с объектами Qt WebKit и JavaScript. Это произошло после того, как объект окна javascript был очищен, например, если я не загружал свои собственные объекты JS в WebKit после загрузки новой страницы.

В основном это означает, что вы пытаетесь использовать внутренне удаленный объект JavaScript.

В этом случае я считаю, что проблема была в том, что я пытался нарисовать изображения на холсте, используя заливку рисунка с не полностью загруженным изображением. Этот вопрос был связан с проблемой 811 Cappuccino, и мои соображения основаны на совете aparajita, чтобы убедиться, что изображение загружено, прежде чем пытаться использовать его в качестве заливки шаблона.

Тем не менее, эта ошибка неприятно непрозрачна, поскольку ключевой фрагмент информации (какой объект был назван) неочевиден и места, в которых он может возникать, различны.

Я видел это, когда пытался динамически написать input[type="file"] элемент с его value набор атрибутов.

Когда я удалил value attr от того, что я вводил, все работало.

В некотором смысле, я вижу эту ошибку как означающую "вы пытались сделать что-то, что спецификация не позволяет", основываясь на этой статье здесь - http://designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr-dom-exception.html

И Chrome, и Safari имеют встроенные отладчики. Убедитесь, что вы используете файл index-debug.html для запуска приложения, чтобы получить легко читаемый код.

В Safari перейдите в "Настройки" и активируйте меню "Разработчик". Затем перейдите в раздел Разработка> Начать отладку JavaScript. Используйте значок паузы в левом нижнем углу, чтобы настроить отладчик для приостановки ошибок. В следующий раз, когда вы столкнетесь с проблемой, отладчик сделает паузу в ошибочной строке и покажет вам, как она прошла через трассировку стека.

Эта проблема возникла для меня, потому что я использовал аудио API, как это:

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

Но это не правильно, потому что функция play() является асинхронной. Вместо этого вам нужно использовать функцию then возвращенного Promise.

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

Возвращаемое значение: Обещание, которое выполняется, когда воспроизведение было начато, или отклоняется, если по какой-либо причине воспроизведение не может быть начато. MDN

Я хотел бы добавить к этому. Получил эту ошибку на Samsung S4 и S5 с помощью стокового браузера.

С моей стороны это было вызвано попыткой воспроизвести аудиофайл, который еще не загружен.

Этот вопрос SO охватывает ту же проблему: DOM Exception 11

Другие вопросы по тегам