[JavaScript] `<link>`で読み込めなかったものをonErrorで検知してみる
2 min read
背景
link 要素の error ってハンドリングできるのかという疑問があり、MDN を覗いてみるとスタイルシートの load イベントがヒットした。
load イベントの発生を確認することで、スタイルシートが読み込まれた時を判断できます。同様に error イベントを確認することで、スタイルシートを処理する際のエラー発生を検出できます。
<script>
var myStylesheet = document.querySelector("#my-stylesheet");
myStylesheet.onload = function () {
// Do something interesting; the sheet has been loaded
};
myStylesheet.onerror = function () {
console.log("An error occurred loading the stylesheet!");
};
</script>
<link rel="stylesheet" href="mystylesheet.css" id="my-stylesheet" />
理想
stylesheet を読み込んでいる link を対象に読み込みエラーのときに何か実行してみたい。
// <link rel="stylesheet"> をすべて拾って
const stylesheets = document.querySelectorAll('link[rel="stylesheet"]');
for (let i = 0; i < stylesheets.length; i++) {
const stylesheet = stylesheets[i];
stylesheet.addEventListener("error", function (e) {
// Sentryなどで通知したい
console.log("error");
});
}
検証
addEventListener('error')
だとハンドリングできなかった。また、MDN のコード(onerror
)を試してみてもできなかった。
インラインイベントハンドラーだとうまくいく
下記のように定義するとうまく実行された。
<script>
function error(element) {
console.log("error:", element);
}
</script>
<link rel="stylesheet" href="sample.css" onerror="error(this)" />