最近、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は2番目の質問に答えようとしますが、それが与える行番号465は、与えるファイルの長さがたった94行のときは何の意味もありません。探し始める場所。
Chromeカナリアは、DOM例外のスタックトレースを提供します!
通常、このメソッドはXMLHttpRequestでasync = trueを指定してopenメソッドを呼び出した場合、または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
)。
このエラーは、<input type="file"
のvalue
プロパティを変更しようとした場合にもスローされます
これはセキュリティチェックです。
この場合、問題は完全にロードされていない画像でパターン塗りつぶしを使用してキャンバスに画像を描画しようとしたことに起因すると考えられます。この質問は Cappuccino issue 811 に関連しており、私の推論は aparajita's パターンフィルとして使用する前にイメージがロードされていることを確認するアドバイスに基づいています。
それでも、このエラーは、重要な情報(オブジェクトと呼ばれるもの)が明らかではなく、発生する可能性のある場所がさまざまであるため、イライラするほど不透明です。
まず、カプチーノのことやあなたが何をしようとしているのか、私は本当に知りません。しかし、Qt WebKitとJavaScriptオブジェクトを操作するときにこれを見てきました。 javascriptウィンドウオブジェクトがクリアされた後に発生しました。新しいページがロードされた後、ネイティブのJSオブジェクトをWebKitにロードしなかった場合。
これは基本的に、内部的に削除されたJavaScriptオブジェクトを使用しようとしていることを意味します。
両方のChromeとSafariにはデバッガが組み込まれています。index-debug.htmlファイルを使用してアプリケーションを起動し、コードを読みやすくしてください。
Safariで、[設定]に移動し、[開発]メニューをアクティブにします。次に、「開発」>「JavaScriptのデバッグの開始」に進みます。左下の一時停止アイコンを使用して、エラー時に一時停止するようにデバッガーを設定します。次回問題が発生すると、デバッガーは問題のある行で一時停止し、スタックトレースを介してどのように到達したかを示します。
これは、value
属性が設定されたinput[type="file"]
要素を動的に書き込もうとすると発生します。
私が注入したものからvalue
attrを削除したとき、すべてうまくいきました。
ある意味では、このエラーは、この記事に基づいて「仕様では許可されていないことをしようとしました」という意味であると考えています- http://designbyjeeba.blogspot.com/2011/04/dreaded-invalidstateerr -dom-exception.html
次のようにAudio APIを使用したため、この問題が発生しました。
let someAudio = new Audio(file);
someAudio.play();
someAudio.pause();
しかし、play()関数は非同期であるため、これは正しくありません。代わりに、返されたPromiseのthen関数を使用する必要があります。
someAudio.play().then(() => someAudio.pause());
戻り値:再生の開始時に満たされるか、何らかの理由で再生を開始できない場合に拒否される約束。 [〜#〜] mdn [〜#〜]
これに追加したいと思います。在庫ブラウザを使用して、Samsung S4およびS5でこのバグを取得しました。
私の側では、まだロードされていないオーディオファイルを再生しようとしたことが原因でした。
このSO質問は同じ問題をカバーしています: DOM例外11