javascript - INVALID_STATE_ERR: DOM Exception 11(WebKit)
cappuccino (11)
¡Chrome canary ofrece rastros de pila para excepciones DOM!
Recientemente probé una aplicación Cappuccino en la que estaba trabajando con Chrome y Safari. Me sale el error:
INVALID_STATE_ERR: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.
La falta de información es frustrante. ¿Qué objeto y dónde intenté usarlo? Chrome intenta responder la segunda pregunta, pero el número de línea que da, 465, no significa nada cuando el archivo que da tiene 94 líneas. Sin más información, ni siquiera sé por dónde empezar a buscar.
En este caso, creo que el problema surgió al tratar de dibujar imágenes en un lienzo utilizando un relleno de patrón con una imagen que no estaba completamente cargada. Esta pregunta estaba relacionada con Cappuccino problema 811 y mi razonamiento se basa en aparajita''s consejos aparajita''s para asegurarse de que la imagen se cargue antes de intentar usarla como relleno de patrón.
Aún así, este error es frustrantemente opaco teniendo en cuenta que la información clave (qué objeto se llamó) no es obvia y los lugares en los que puede surgir son variados.
En mi caso, estaba configurando los encabezados antes de abrir la conexión. Para evitar este error, los encabezados deben configurarse después de abrir la conexión:
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);
Entiendo que esta respuesta es específica para mi problema y no el mensaje genérico INVALID_STATE_ERR: DOM Exception 11, pero pensé que publicaría mi solución aquí para la siguiente persona.
Este error también se produce al intentar modificar la propiedad del value
de un <input type="file"
Esto es un control de seguridad.
Este problema ocurrió para mí porque utilicé la API de audio de esta manera:
let someAudio = new Audio(file);
someAudio.play();
someAudio.pause();
Pero esto no es correcto porque la función play () es asíncrona. En su lugar, debe usar la función de la Promesa devuelta.
someAudio.play().then(() => someAudio.pause());
Valor de retorno: Promesa que se cumple cuando la reproducción se ha iniciado o se rechaza si, por algún motivo, no se puede iniciar la reproducción. MDN
Esto también puede suceder cuando Javascript intenta document.write()
en una página XHTML ( Content-Type: application/xhtml+xml
).
Lo he visto al intentar escribir dinámicamente un elemento de input[type="file"]
con su conjunto de atributos de value
.
Cuando eliminé el value
atr de lo que estaba inyectando, todo funcionó.
En cierto sentido, veo este error como "trataste de hacer algo que la especificación no permite" basado en este artículo aquí - http://designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr-dom-exception.html
Me gustaría agregar a esto. Tengo este error en un Samsung S4 y S5 usando el navegador de valores.
Por mi parte, fue causado por intentar reproducir un archivo de audio que aún no se ha cargado.
Esta pregunta SO cubre el mismo problema: DOM Exception 11
Por lo general, este error ocurre con XMLHttpRequest cuando llama al método abierto con async = true, o deja el parámetro async indefinido para que sea asincrónico y luego accede al estado o a las propiedades de responseText. Esas propiedades solo están disponibles después de realizar una llamada síncrona o de que readyState esté listo (una vez que responde la llamada asíncrona). Le sugiero que primero intente con async = false, y luego cambie a que sea verdadero y use el parámetro onReadyStateChange.
Primero, realmente no sé nada de Cappucino o de lo que estás tratando de hacer. Pero lo he visto al trabajar con objetos Qt WebKit y JavaScript. Sucedió después de que el objeto de la ventana de JavaScript se borró, por ejemplo, si no cargué mis objetos JS nativos a WebKit después de que se cargó una nueva página.
Esto significa básicamente que está intentando usar un objeto JavaScript eliminado internamente.
Tanto Chrome como Safari han incorporado depuradores. Asegúrese de utilizar el archivo index-debug.html para iniciar su aplicación y obtener un código fácil de leer.
En Safari, ve a Preferencias y activa el menú Desarrollador. Luego vaya a Desarrollar> Iniciar la depuración de JavaScript. Use el ícono de pausa en la esquina inferior izquierda para configurar el depurador para detener los errores. La próxima vez que veas el problema, el depurador hará una pausa en la línea ofensiva y te mostrará cómo llegó allí a través del seguimiento de la pila.