J'ai récemment testé une application Cappuccino sur laquelle je travaillais sous Chrome et Safari. Je reçois l'erreur:
INVALID_STATE_ERR: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.
Le manque d'informations est frustrant. Quel objet et où ai-je essayé de l'utiliser? Chrome tente de répondre à la deuxième question mais le numéro de ligne indiqué 465 ne signifie rien si le fichier qu'il contient ne contient que 94 lignes. Sans plus d'informations, je ne sais même pas par où commencer.
Chrome Canary offre des traces de pile pour les exceptions DOM!
Généralement, cette erreur se produit avec XMLHttpRequest lorsque vous appelez la méthode open avec async = true ou laissez le paramètre async non défini afin qu'il soit défini par défaut sur asynchrone, puis vous accédez aux propriétés status ou responseText. Ces propriétés ne sont disponibles qu'après un appel synchrone ou lorsque le readyState est prêt (une fois que l'appel asynchrone a répondu). Je vous suggère d’essayer d’abord avec async = false, puis de passer à la valeur true et d’utiliser onReadyStateChange.
Dans mon cas, je mettais les en-têtes avant d'ouvrir la connexion. Pour éviter cette erreur, les en-têtes doivent être définis après l'ouverture de la connexion:
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);
Je comprends que cette réponse est spécifique à mon problème et non pas au message générique INVALID_STATE_ERR: DOM Exception 11, mais que je posterais ici ma solution pour la personne suivante.
Cela peut également arriver lorsque Javascript essaie de document.write()
dans une page XHTML (Content-Type: application/xhtml+xml
).
Cette erreur est également générée lors d’une tentative de modification de la propriété value
d’un <input type="file"
.
Ceci est une vérification de sécurité.
Dans ce cas, je pense que le problème était d’essayer de dessiner des images sur du canevas en utilisant un motif de remplissage avec une image qui n’était pas entièrement chargée. Cette question était liée à Cappuccino numéro 811 et mon raisonnement est basé sur aparajita conseil de s'assurer que l'image est chargée avant de tenter de l'utiliser comme motif de remplissage.
Néanmoins, cette erreur est opaque de manière frustrante, étant donné que l’information clé (quel objet a été appelé) n’est pas évidente et que les endroits dans lesquels elle peut apparaître sont variés.
Premièrement, je ne sais pas vraiment quoi que ce soit de Cappucino ou de ce que vous essayez de faire. Mais j'ai déjà vu cela lorsque je travaillais avec Qt WebKit et des objets JavaScript. Cela s'est produit après la suppression de l'objet de fenêtre javascript, par exemple. si je n'ai pas chargé mes objets JS natifs dans WebKit après le chargement de la nouvelle page.
Cela signifie essentiellement que vous essayez d'utiliser un objet JavaScript supprimé en interne.
Chrome et Safari ont tous deux des débogueurs intégrés. Assurez-vous d'utiliser le fichier index-debug.html pour lancer votre application afin d'obtenir du code facile à lire.
Dans Safari, allez dans Préférences et activez le menu Développeur. Ensuite, sélectionnez Développement> Démarrer le débogage de JavaScript. Utilisez l'icône de pause en bas à gauche pour configurer le débogueur pour qu'il suspende les erreurs. La prochaine fois que vous rencontrerez le problème, le débogueur s'interrompra sur la ligne incriminée et vous montrera comment il y est parvenu grâce à la trace de la pile.
J'ai vu cela se produire lors de la tentative d'écriture dynamique d'un élément input[type="file"]
avec son ensemble d'attributs value
.
Quand j’ai retiré le value
attr de ce que j’injectais, tout fonctionnait.
En un sens, je vois cette erreur comme signifiant "vous avez essayé de faire quelque chose que la spécification ne permet pas" d'après cet article - http://designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr- dom-exception.html
Ce problème s'est produit pour moi parce que j'ai utilisé l'API audio comme ceci:
let someAudio = new Audio(file);
someAudio.play();
someAudio.pause();
Mais ceci n’est pas correct car la fonction play () est asynchrone. Au lieu de cela, vous devez utiliser la fonction then de la promesse retournée.
someAudio.play().then(() => someAudio.pause());
Valeur de retour: Une promesse qui est remplie lorsque la lecture a commencé ou qui est rejetée si, pour une raison quelconque, la lecture ne peut pas être démarrée . MDN
Je voudrais ajouter à cela. Vous avez ce bug sur un Samsung S4 et S5 en utilisant le navigateur stock.
De mon côté, cela a été causé par la tentative de lecture d'un fichier audio qui n'a pas encore été chargé.
Cette SO question couvre le même problème: Exception DOM 11