onerror事件

onerror 事件会在文档或图像加载过程中发生错误时被触发。

  在装载文档或图像的过程中如果发生了错误,就会调用该事件。

例:

img标签中的src图片加载失败,原来的图片位置会出现一个加载失败的小图;

onerror事件就在发生错误时被调用,从而用一张备用图片替代原图;

<img src="images/pic.jpg"onerror="javascript:this.src='images/error.jpg;'"/>

如果error.jpg 也不存在,则继续触发 onerror,去请求error.jpg,然后循环、报错404。

解决:

  1.保证备用图片一定存在,并且足够小,在网速情况差的时候也能轻松加载;

  2.当备用图片加载错误再次触发onerror时,让其不再请求;

<img src="images/pic.jpg" onerror="nofind(this)"/>
<script type="text/javascript"> 
    function nofind(){ ; 
        img.src="images/error.jpg"; 
        img.onerror=null; 
    } 
</script>

 

W3school:

使用 onerror 事件是一种老式的标准的在网页中捕获 Javascript 错误的方法。(chrome、opera、safari 浏览器不支持)

创建一个函数

function handleErr(msg,url,l){  //msg(错误消息)、url(发生错误的页面的 url)、line(发生错误的代码行)
  //Handle the error here
  return true or false
}

浏览器是否显示标准的错误消息,取决于 onerror 的返回值。如果返回值为 false,则在控制台 (JavaScript console) 中显示错误消息。反之则不会。

<html>
<head>
    <script type="text/javascript">
        onerror=handleErr
        var txt=""

        function handleErr(msg,url,l){
            txt =  "There was an error on this page.\n\n";
            txt += "Error: " + msg + "\n";
            txt += "URL: " + url + "\n";
            txt += "Line: " + l + "\n\n";
            txt += "Click OK to continue.\n\n";
            alert(txt);
            return true;
        }

        function message(){
            adddlert("Welcome guest!")
        }
    </script>
</head>
<body>
  <input type="button" value="View message" onclick="message()" />
</body>
</html>

 

转载于:https://www.cnblogs.com/Axwen/p/6049044.html

<think> 我们正在讨论的是Web开发中的`onerror`事件。根据引用内容,`onerror`事件处理程序在HTML元素(如`<img>`或`<script>`)加载资源失败时触发。此外,在JavaScript中,`window.onerror`事件可以捕获运行时错误,并带有三个参数:错误信息、发生错误的URL和行号。 ### `onerror`事件详解 #### 1. **HTML元素上的`onerror`** - 当HTML元素(如`<img>`, `<script>`, `<link>`等)引用的资源加载失败(例如,图片不存在、脚本加载失败)时,会触发`onerror`事件。 - 示例: ```html <img src="image.png" onerror="handleImageError()"> ``` 如果`image.png`加载失败,则执行`handleImageError`函数。 - 引用说明:引用[1]提到,当`<img>`或`<script>`等标签引用的资源不存在时,`onerror`事件处理程序就会被触发[^1]。 #### 2. **`window.onerror`全局错误处理** - `window.onerror`是一个全局事件处理程序,用于捕获JavaScript运行时错误(包括语法错误和运行时异常)。 - 它接受三个参数: - `message`:错误信息(字符串) - `source`:发生错误的脚本URL(字符串) - `lineno`:发生错误的行号(数字) - `colno`(非标准但部分浏览器支持):发生错误的列号 - `error`(非标准但部分浏览器支持):Error对象(包含堆栈信息) - 示例: ```javascript window.onerror = function(message, source, lineno, colno, error) { console.log(`错误:${message},发生在 ${source} 的第 ${lineno} 行`); return true; // 阻止默认错误提示(如控制台输出) }; ``` - 注意:如果返回`true`,则阻止浏览器默认的错误报告(如控制台打印错误),否则错误会继续向上冒泡。 - 引用说明:引用[2]详细介绍了`window.onerror`事件,包括它的三个参数(错误信息、URL、行号)[^2]。 #### 3. **`<script>`标签的`onerror`兼容性问题** - 并非所有浏览器都支持`<script>`标签的`onerror`事件(如IE6-8不支持,Opera旧版本也不支持)。 - 引用[3]提到,为了兼容所有浏览器检测脚本加载失败,可以采用如下技巧: - 在JSONP请求中,回调函数通常会在脚本加载完成前执行。因此,可以在回调函数中设置一个标记,然后在脚本的`onload`(或`onreadystatechange`)事件中检查该标记。如果没有标记,则说明脚本加载失败。 - 示例(来自司徒正美的方案): ```html <script> var script = document.createElement('script'); script.src = "http://example.com/jsonp?callback=myCallback"; document.body.appendChild(script); // 回调函数 function myCallback(data) { script.loaded = true; // 标记已成功加载 // 处理数据 } // 检测加载状态 script.onload = script.onreadystatechange = function() { if (!script.loaded && (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete')) { // 执行错误处理 console.log('脚本加载失败'); } }; </script> ``` - 引用说明:引用[3]讨论了`<script>`标签的`onerror`兼容性问题,并提供了替代方案[^3]。 #### 4. **使用场景** - **资源监控**:监控图片、脚本等资源是否成功加载,以便替换备用资源或上报错误。 - **错误收集**:通过`window.onerror`全局捕获JavaScript错误,并上报到服务器,用于监控和调试。 - **优雅降级**:当关键资源(如CDN上的框架脚本)加载失败时,提供备用方案(如使用本地资源)。 ### 相关问题 1. 如何利用`window.onerror`实现前端错误监控系统? 2. 除了`onerror`,还有哪些方法可以处理脚本加载失败? 3. 在跨域脚本中,`window.onerror`能捕获完整的错误信息吗? </think> ### `onerror` 事件详解 `onerror` 是 Web 开发中用于错误处理的关键事件,主要作用于 **HTML 元素** 和 **JavaScript 全局对象**,以下是其核心机制与应用场景: --- #### 一、HTML 元素中的 `onerror` 当 HTML 元素加载资源失败时触发: 1. **触发条件** - `<img>`:图片加载失败(无效 URL 或跨域阻断) - `<script>`:脚本加载失败(404 错误或语法错误) - `<link>`:CSS 文件加载失败 *示例*: ```html <img src="broken.jpg" onerror="alert('图片加载失败')"> ``` 2. **使用场景** - 资源降级处理(如替换备用图片) - 监控 CDN 资源可用性 - 第三方脚本加载状态检测[^1] --- #### 二、JavaScript 全局 `window.onerror` 用于捕获运行时 JavaScript 错误: 1. **参数解析** 事件处理函数包含三个核心参数: ```javascript window.onerror = function(message, url, line) { // message: 错误信息(如 "Uncaught ReferenceError: x is not defined") // url: 发生错误的脚本 URL // line: 错误行号 } ``` *示例*: ```javascript window.onerror = (msg, url, line) => console.log(`错误:${msg},位置:${url}:${line}`); ``` 2. **特殊性质** - 仅在发生错误时触发(无错误时为 `null`) - 可取代 `try/catch` 实现全局错误监控 - 返回值 `true` 可阻止浏览器默认错误提示[^2] --- #### 三、兼容性挑战与解决方案 1. **`<script>` 的兼容性问题** - ✅ 支持:Chrome, Firefox, Safari, IE9+ - ❌ 不支持:IE6-8, Opera 旧版 - **检测方案**: ```javascript const supportsScriptOnerror = 'onerror' in document.createElement('script'); ``` 2. **跨浏览器解决方案(JSONP 示例)** 通过标记法检测脚本加载状态: ```javascript let script = document.createElement('script'); script.src = "https://api.example.com/data?callback=handleData"; // 成功回调中设置标记 window.handleData = (data) => { script.loaded = true; // 加载成功标记 // 处理数据... }; // 通过 onload 检测标记 script.onload = script.onreadystatechange = function() { if (!script.loaded && (!this.readyState || this.readyState === 'complete')) { console.error('脚本加载失败!'); } }; ``` *原理*:利用回调函数执行早于 `onload` 的特性[^3] --- #### 四、应用场景对比 | **类型** | 触发时机 | 典型应用 | 兼容性 | |------------------|-------------------------|----------------------------|---------------------| | **HTML onerror** | 资源加载失败 | 图片/CDN 故障监控 | 全浏览器支持 | | **window.onerror** | JS 运行时错误 | 前端错误监控系统 (Sentry) | IE6+ 支持基本参数 | | **Script onerror** | 脚本加载/执行失败 | 第三方 SDK 可用性检查 | IE9+ 现代浏览器 | --- ### 相关问题 1. 如何通过 `window.onerror` 实现前端错误上报系统? 2. 在跨域脚本中捕获完整错误信息需要哪些 HTTP 头配置? 3. 现代框架(如 React/Vue)的错误边界(Error Boundaries)与 `onerror` 有何区别? [^1]: HTML 元素资源加载失败触发机制 [^2]: JS 全局错误捕获的参数与特性 [^3]: 跨浏览器脚本加载检测方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值