script error.的定义

script error.是一个常见的错误,它类似于b is not definedscript error.与这个错误不同的点就在于其并没有详细的错误信息

script error.产生原因

先来说一下b is not defined这个错误要如何产生

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>window.onerror = function (message, url, line, column, error) {console.log(message, url, line, column, error);}console.log(b);</script>
</body>
</html>

结果很明显的,我们捕获到了这个错误的详细信息

下面来复现下script error.,我们将上面的一小段代码上传到服务器上,然后在现有的js中加上这样一段代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>window.onerror = function (message, url, line, column, error) {console.log(message, url, line, column, error);}</script><script src="https://cmc-web.oss-cn-beijing.aliyuncs.com/2.js"></script>
</body>
</html>

你看,这个神秘的script error.出现了,而且最有用的信息恐怕就是script error.了????

这两种case有何不同?第二种情况下,我们引用了一个非同源的文件。

在webkit中,有这样一段代码

bool ScriptExecutionContext::sanitizeScriptError(String& errorMessage, int& lineNumber, String& sourceURL){KURL targetURL = completeURL(sourceURL);if (securityOrigin()->canRequest(targetURL))return false;errorMessage = "Script error.";sourceURL = String();lineNumber = 0;return true;}

它会解析来源url,如果和当前url不是同源的时候,就会强制errorMessagescript error.。所以,可以得出结论:这是浏览器出于安全的考虑,刻意隐藏了其他域下js文件抛出的错误信息,这样可以避免敏感信息无意中被不受控制的第三方脚本捕获。所以,对于其他域下发生的错误,我们也只是能知道这里有一个错误,并无从知道错误信息的详细内容。

script error.解决办法

不知道详细错误信息可不行呀,那怎么办呢?这里有两种解决方案

先来试试crossOrigin?

这个其实就是开启CORS(跨域资源共享),这个方法要分两步来操作:

1、script标签加上crossOrigin属性:告知浏览器以匿名的方式获取目标脚本,这意味着请求脚本时不会向服务端发送潜在的用户身份信息

crossorigin="anonymous"

2、添加跨域HTTP响应头

Access-Control-Allow-Origin: *或者Access-Control-Allow-Origin: https://cmc-web.oss-cn-beijing.aliyuncs.com

完成这两步操作后,看下结果:

再来试试try catch?

先来说下try catch的优点:浏览器不会对其异常进行跨域拦截,所以这个时候可以拿到堆栈信息。

但同时它也有缺点:

如果使用try catch的话,只能捕获到同步的错误,像这样:

try {console.log(b);
} catch (error) {console.log(error);
}

如果换成异步呢

 try {setTimeout(() => {console.log(b);}, 2000)
} catch (error) {console.log(error);
}

会发现并拿不到错误信息,所以针对此现象,我们对不同的动作做不同的改动

拦截普通函数捕获异常

考虑到这句console.log(b)直接写在代码里,也不会打包成功,所以这块我们稍加修改,重新上传到服务器

function test() {console.log(b);
}

下面写一个拦截函数,考虑到我们可能对很多个函数都要做拦截,所以采取这样一个思想:函数执行统一交给另外一个函数,统一拦截这个函数

function emit(callback) {callback()
}let originError = emit;
emit = function(func) {const addStack = new Error(`Event error`).stack;const wrapppedFunc = function(...args) {try {return func.apply(this, args);}catch (err) {// 异常发生时,扩展堆栈err.stack += '\n' + addStack;throw err;}}return originError.call(this, wrapppedFunc);
}

拦截事件函数捕获异常

<button id="btn">点我</button>// script
let oBtn = document.getElementById('btn');
oBtn.addEventListener('click', function() {test();
}, false)

因为上面写了对于普通函数的异常捕获拦截,所以可以这样解:

let oBtn = document.getElementById('btn');
oBtn.addEventListener('click', function() {emit(test);
}, false)

如果不想每次都调用emit函数,就要实现一个对于事件拦截的函数:

let originAddEventListener = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(type, func, async) {const addStack = new Error(`Event ${type}`).stack;const wrapppedFunc = function(...args) {try {return func.apply(this, args);}catch (err) {// 异常发生时,扩展堆栈err.stack += '\n' + addStack;throw err;}}return originAddEventListener.call(this, type, wrapppedFunc, async);
}

结果如下:

拦截setTimeout函数捕获异常

setTimeout同上

let originSetTimeout = window.setTimeout;
window.setTimeout = function(func, delay) {const addStack = new Error(`setTimout error`).stack;const wrapppedFunc = function(...args) {try {return func(args);}catch (err) {// 异常发生时,扩展堆栈err.stack += '\n' + addStack;throw err;}}return originSetTimeout.call(this, wrapppedFunc, delay);
}

综上几个case,发现都是用try catch包裹,那有没有办法使用一个通用的办法通通解决呢?

写在最后

本文理了一下script error从产生到解决的过程,我们可以思考一下最后抛出来的问题~

最后,分享一下我的个人微信公众号「web前端日记」,大家可以关注一波~

【JavaScript】为什么是script error.相关推荐

  1. Fundebug前端JavaScript插件更新至1.7.1,拆分录屏代码,还原部分Script error.

    摘要: BUG监控插件压缩至18K. 1.7.1拆分了录屏代码,BUG监控插件压缩至18K,另外我们还原了部分Script error,帮助用户更方便地Debug.请大家及时更新哈~ 拆分录屏代码 从 ...

  2. 压缩过的js代码怎么还原_Fundebug 前端 JS插件更新至 1.7.0,拆分录屏代码,还原部分 Script error....

    摘要: BUG 监控插件压缩至 18K. 1.7.0拆分了录屏代码,BUG 监控插件压缩至18K,另外我们还原了部分 Script error,帮助用户更方便地 Debug.请大家及时更新哈~ 拆分录 ...

  3. java script error_java script error 错误解决方法

    用了动易这么久了,有时一不小心改错模版文件或者 修改相关的JS,就会导致页面出现一些奇怪了 的弹出框 说什么 java script error 错误,烦死了. 今天特别研究了下,找到了解决这类问题的 ...

  4. 前端demo_【前端3分钟】Script Error产生的原因和解法

    Script Error对于前端开发者相信都不陌生,而且由于没有具体错误堆栈和代码行列号,成为可能是最神秘的错误之一. 下面介绍Script Error产生的原理和解决办法. 1.Script Err ...

  5. 解决 Script Error 的另类思路

    2019独角兽企业重金招聘Python工程师标准>>> 本文由小芭乐发表 前端的同学如果用 window.onerror 事件做过监控,应该知道,跨域的脚本会给出 "Scr ...

  6. Ansys中meshing启动时经常弹出“script error”

    最近在学习ansys的流固耦合仿真,在打开ansys 的meshing 时,总是弹出 script error的错误. 卸载的软件重新安装还是没有效果,后来想明白是之前为了释放C盘内存,修改了系统的临 ...

  7. xShell运行Python脚本报错 Python script error 80040154

    xShell运行Python脚本报错 Python script error 80040154 这是由于没有安装 Python engine的原因. 解决方法如下: 1. 下载并安装 Python 访 ...

  8. Uncaught Error: Script error for popper.js, needed by: bootstrap 解决方案

    Uncaught Error: Script error for "popper.js", needed by: bootstrap https://requirejs.org/d ...

  9. JavaScript基础之'script'Tag的使用

    Use the 'script' tag to incluse your javascript code 代码如下: <html> <head> <title>Ti ...

  10. 在线文本替换工具 、支持正则表达式(博客园文章里添加Javascript或<script>语句)

    概况与介绍 在博客园发布一篇文章,文章就是<在线文本替换工具 .支持正则表达式>https://www.cnblogs.com/lsllll44/articles/15522697.htm ...

最新文章

  1. UML系列图--用例图
  2. Vue.js实现tab切换效果
  3. OpenCV—形态学运算定义与实现
  4. 注入双括号报错注入_SQL手动注入:sqlilabs(less110)
  5. Linux:tomcat安装/版本升级
  6. python虚拟开发环境搭建(virtualenv和virtualenvwrapper)
  7. 独立站牵手Tik Tok 打造下一个电商节点
  8. 【算法】经典的ML算法(后续结合工作实践完善心得)
  9. 左右方块消除html5,html5消除方块游戏总结-对象
  10. 【工作感悟】linuxdocker运行windows镜像
  11. obspy中文教程(六)
  12. Chrome快捷键大全:Chrome窗口和标签页快捷键、功能快捷键、网页快捷键
  13. Favicon.ico图片在线制作网站PHP源码+支持多种图片格式转换
  14. 小程序真机预览图片不显示
  15. Springboot毕设项目理财管理系统mnl7cjava+VUE+Mybatis+Maven+Mysql+sprnig)
  16. 485通讯的校验和_组态王与西门子S71200PLC无线Modbus通讯
  17. xinetd.d详解
  18. 最老程序员创业开发实训12---Android---在MVC架构下Activity设计及实现
  19. 第1个Qt项目:计算器
  20. 【查找域名】根据ip反向查找域名方法

热门文章

  1. Mysql中的straight_join
  2. 计算机思维培训心得,计算机教师培训心得体会
  3. scrapy IP代理池 scrapyd spiderkeeper docker flask uwsgi nginx
  4. ecap捕捉epwm波形的占空比及频率(总结)
  5. dsp28335 Ecap总结
  6. 微信公众号CSS样式常见问题解析
  7. 俩 AI 约会遭全网围观:再厉害的算法,也逃不了翻车
  8. #!/bin/bash 和 #!/usr/bin/env bash 的区别
  9. C语言删除字符串中的单词
  10. for horner_霍纳法则(Horner Rule)