博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js捕获404错误
阅读量:6831 次
发布时间:2019-06-26

本文共 2993 字,大约阅读时间需要 9 分钟。


title: js捕获404错误 tags:

  • fundebug
  • 404
  • usecaptureargument
  • errorEvent categories: 前端 date: 2017-06-25 18:18:53

最近使用fundebug,发现fundebug升级到了0.1.0,支持了

Fundebug的JavaScript监控插件更新至0.1.0,可以监控3种不同类型的前端BUG:JavaScript执行错误资源加载错误HTTP请求错误

以前一直记得浏览器404是无法捕获的,这是什么黑魔法呢?

众所周知通过ajax是可以获得状态的,那么正常图片的加载出错等我们都是通过onError来加载。但是全局捕捉404貌似没听过,特别是js等。

之前因为考虑无法捕捉到404等错误还特别考虑了非覆盖发布。

那么fundebug通过什么思路实现的呢?

扒了一下源码:

发现两处区别:

  1. 使用的是addEventListener而不是onError
  2. 判断了t.message

而我们正常是通过window.onerror来捕捉错误并且直接使用异常的message。

参考 

Jump to the appropriate set of steps from the list below:

If the load resulted in an error (for example a DNS error, or an HTTP 404 error)Executing the script block must just consist of firing a simple event named error at the element.

Firing a simple event named e means that a  event with the name e, which does not bubble (except where otherwise stated) and is not cancelable (except where otherwise stated), and which uses the Event interface, must be created and  at the given target.

通过Google发现确实存在此种方法捕获各种错误

To capture all error events on the page, you can use  with the useCaptureargument set to true. The reason window.onerror will not do this is because it uses the bubble event phase, and the error events you want to capture do not bubble.

If you add the following script to your HTML before you load any external content, you should be able to capture all the error events, even when loading offline.

window.addEventListener('error', function(e) { console.log(e); }, true); 复制代码

You can access the element that caused the error through e.target. For example, if you want to know what file did not load on an img tag, you can use e.target.src to get the URL that failed to load.

因此可以认为上文中加载失败可以触发event,但是必须要设置useCaptureargument为true。

通过断点调试发现当出现404错误时类型为ErrorEvent

对应的event确实是没有message的。

e.addEventListener && e.addEventListener("error", function(t) {            if (!t.message) {                var r, n = (r = t.target ? t.target : t.srcElement) && r.outerHTML;                n && n.length > 200 && (n = n.slice(0, 200));                var a = {                    type: "resourceError",                    target: {                        outerHTML: n,                        src: r && r.src,                        tagName: r && r.tagName,                        id: r && r.id,                        className: r && r.className,                        name: r && r.name,                        type: r && r.type                    }                };                if (a.target.src && e.XMLHttpRequest) {                    var u = new XMLHttpRequest;                    u.Fundebug = !0,                    u.open("OPTIONS", a.target.src),                    u.send(),                    u.onload = function(e) {                        200 !== e.target.status && (a.target.status = e.target.status,                        a.target.statusText = e.target.statusText),                        f(a)                    }                }            }        }, !0);复制代码

由此就可以捕获了加载错误。

转载地址:http://cnnkl.baihongyu.com/

你可能感兴趣的文章
LeetCode-Pascal's Triangle
查看>>
你可能不知道的PHP加减法
查看>>
CentOS 7下安装Tomcat到服务
查看>>
8051,PIC,AVR和ARM有什么区别?
查看>>
创建最小的Go docker 镜像
查看>>
浅入分析Linux
查看>>
jenkins 从git拉取代码
查看>>
Nginx 配置详解(学习笔记二)
查看>>
C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码
查看>>
查看安卓APK源码破解
查看>>
JavaScript权威指南 - 函数
查看>>
Android Studio Failed to open zip file
查看>>
Kubernetes 学习笔记(二)--- K8S应用快速入门
查看>>
mysql进阶(六)
查看>>
云场景实践研究第84期:东润环能
查看>>
面试 -- 数字签名与数字证书
查看>>
Java Web基础入门
查看>>
Android2.2 API 中文文档系列(6) —— ImageView
查看>>
LoadRunner多场景的串行执行以及定时执行
查看>>
不被注意的细节 WiFi密码暗藏巨大隐患
查看>>