我想在网页中检测某些 javascript 或 css 元素加载失败的情况,并提醒用户。我有以下但不起作用。
(实际用例涉及需要安装某些证书的最终用户,如果元素无法加载,页面将向他们提供有关如何更新浏览器/操作系统的说明。但这是我实现该解决方案的最小可重现测试用例.)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Lorum Title Ipsus</title>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
// Monitor <script> elements
document.querySelectorAll('script[src]').forEach(script => {
script.addEventListener('error', function() {
alert('Failed to load script:', script.src);
}, true);
});
// Monitor <link rel="stylesheet"> elements
document.querySelectorAll('link[rel="stylesheet"]').forEach(link => {
link.addEventListener('error', function() {
alert('Failed to load stylesheet:', link.href);
}, true);
});
});
</script>
<!-- **** NOTE THE OBVIOUS ERROR BELOW -->
<link href="https://ERRRORcdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</head>
<body>
Lorum Ipsus
</body>
</html>
对于同步脚本,
DOMContentLoaded
事件仅在(尝试)加载和评估它们之后才会触发,因此您会错过 error
事件。
您可以尝试使用突变观察器来检测脚本的创建并立即附加错误处理程序,或者尝试将错误处理程序附加到
event
或
window
或 document
本身(尽管它不应起泡)。