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