14

エラーイベント情報にアクセスしようとすると、Firefox(15を使用していますが、ナイトリーでも同じです)がWebKitのように動作しない理由を理解しようとしています。

これはどこでも機能します:

window.onerror = function(message, lineno, filename) { }

しかし、もちろん私はこれを使いたくありません。

正しいことは次のとおりです。

window.addEventListener('error', function(e) { 
  console.log(e.message);
}, false);

残念ながら、これは WebKit でしか機能しません。Firefox ではハンドラーが呼び出されますが、eイベントはほとんど空です。メッセージ、行番号、ファイル名のプロパティはありません。

非常に最小限のテストはここにあります: http://jsbin.com/efexiw/1/edit

これはバグではないと思いますが、問題は次のとおりです。最近の Firefox でエラーの詳細を取得するにはどうすればよいですか?

4

1 に答える 1

24

HTML5 仕様では、解析エラーが発生した場合にブラウザーが次のことを行う必要があります。

...グローバル オブジェクトを使用して、問題のある位置 (行番号と列番号) と共にスクリプトのエラーを報告します... ターゲットとして。

エラーを報告する」には手順が含まれます

  1. messageユーザー エージェントが定義した、エラーをわかりやすい方法で説明する文字列にします。

...

  1. eventを、バブルは発生しないがキャンセル可能で、イベント名 を持つ新しい信頼できるオブジェクトとます。ErrorEventerror

  2. eventmessage属性をmessageに初期化します。

...

  1. targetでイベントをディスパッチします。

したがって、HTML5 準拠のブラウザはすべて、解析時のエラー イベントを で報告します。これには、「ユーザー エージェントが定義した、エラーをわかりやすい方法で説明する文字列」に設定された属性windowが含まれます。これを実行できないブラウザ バージョンはまだありません。この点で HTML5 に準拠しています。message


以前 (この質問が書かれた時点で) は、window.onerrorによって提供されなかった情報を提供しましたwindow.addEventListener("error")。古いバージョンの Firefox を使用する必要がある場合は、以下を安全に使用window.onerrorできます。

// Example 1:

// Prevent error dialogs from displaying -which is the window's normal
// behavior- by overriding the default event handler for error events that
// go to the window.
window.onerror = null;

// Example 2:

var gOldOnError = window.onerror;
// Override previous handler.
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
  if (gOldOnError)
    // Call previous handler.
    return gOldOnError(errorMsg, url, lineNumber);

  // Just let default handler run.
  return false;
}
于 2012-10-05T13:31:37.143 に答える