Script Error对于前端开发者相信都不陌生,而且由于没有具体错误堆栈和代码行列号,成为可能是最神秘的错误之一。

下面介绍Script Error产生的原理和解决办法。

1、Script Error是如何产生的

  • 跨域资源引用

假如:abc.com 下的页面引用了属于 http://def.com(CDN) 的 demo.js 文件。

若运行中demo.jsrun()方法 内部报了一个异常,那么前端的错误捕获脚本,只会检测到一个 script error的异常。

这是由于浏览器基于安全考虑故意隐藏了其它域JS文件抛出的具体错误信息。这样可以有效避免敏感信息无意中被第三方(不受控制的)脚本捕获到,因此,浏览器只允许同域下的脚本捕获具体的错误信息。

具体可以参考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;}

2、如何解决

知道浏览器为什么限制跨域资源引用,解决办法也不困难。在页面请求资源时,让浏览器允许我们发起请求,而服务器(CDN)也允许我们获取资源,从而得到浏览器运行资源的错误信息;这样分两步解决。

  • 第一步:给script标签增加 crossorigin 属性,让浏览器允许页面请求资源。
// 以下两种写法均可
<scrpit src="http://def.com/demo.js" crossorigin></script><scrpit src="http://def.com/demo.js" crossorigin="anonymous"></script>

  • 第二步:给静态资源响应头增加允许跨域标记,让服务器允许资源返回。

服务器的HTTP响应头增加 Access-Control-Allow-Origin: * 或者 Access-Control-Allow-Origin: http://def.com

注:大部分主流CDN默认添加了Access-Control-Allow-Origin属性。

3、已添加 crossorigin 依然有 script error

由于部分浏览器对crossorigin属性不支持,又或者我们无法往HTTP请求响应头里面添加跨域属性,因此依然可能产生script error。

这时还可以通过try catch获取页面报错信息,将JS错误重新抛出或者上报。

  try {run(); // 调用demo.js中定义的run方法} catch (e) {console.log(e);throw e; }

4、参考

  • Cross-Origin Resource Sharing (CORS)
  • The crossorigin attribute: Requesting CORS access to content

5、更多文章分享

  • 阿里UC百亿级PV的前端监控平台实践 https://zhuanlan.zhihu.com/p/79978987
  • 10分钟彻底搞懂前端页面性能监控 https://zhuanlan.zhihu.com/p/82981365

6、岳鹰-WEB前端监控

阿里UC出品的岳鹰WEB前端监控,支持移动H5、PC站点、微信小程序以及支付宝小程序等各家小程序,PV、JS异常、页面性能等监控指标完整,已经对外开放,欢迎免费体验试用。

技术交流、第一时间掌握产品动态,欢迎联系微信小助手~

微信号 effirst-assistant

前端demo_【前端3分钟】Script Error产生的原因和解法相关推荐

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

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

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

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

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

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

  4. 解决 Script Error 的另类思路

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

  5. GMTC 大前端时代前端监控的最佳实践

    摘要: 今天我分享的内容分成三个部分: 第一部分是"大前端时代前端监控新的变化", 讲述这些年来,前端监控一些新的视角以及最前沿的一些思考. 第二部分"前端监控的最佳实践 ...

  6. 前端:前端安全编码规范

    前言 随着互联网高速的发展,信息安全已经成为企业重点关注焦点之一,而前端又是引发安全问题的高危据点,所以,作为一个前端开发人员,需要了解前端的安全问题,以及如何去预防.修复安全漏洞. 下面就以前端可能 ...

  7. GMTC 大前端时代前端监控的最佳实践 1

    摘要: 今天我分享的内容分成三个部分: 第一部分是"大前端时代前端监控新的变化", 讲述这些年来,前端监控一些新的视角以及最前沿的一些思考. 第二部分"前端监控的最佳实践 ...

  8. 零基础不建议学前端_web前端开发零基础怎样入门-哈尔滨前端学习

    web前端开发零基础怎样入门-哈尔滨前端学习,俗话说,知己知彼,百战百胜.要想学好web前端,首先要了解什么是web前端,下面由小编来给大家介绍一下: 1什么是web? Web就是在Http协议基础之 ...

  9. 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案...

    后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440. 解决方法: ...

最新文章

  1. 第十六届全国大学生智能车安徽赛区承办学校参赛队伍
  2. 将一列数据转换成一个字段数据,逗号分隔
  3. jQuery1.9+中删除了live以后的替代方法
  4. 4、Orcal数据库dmp文件导入
  5. 个性化显示服务器,Linux系统个性化登录提示信息的方法
  6. 重新分区_电脑磁盘分区指南!一分钟就学会
  7. 管理动物园动物c++_中国动物园行业供需预测及投资潜力分析
  8. 详解CvScalar类型
  9. 单片机从00到99c语言,跪求单片机0~99数码管显示用C语言编写的程序
  10. java: Internal error in the mapping processor: java.lang.NullPointerException问题解决
  11. 服务器回退本次提交的文件,Git提交完整步骤与CMD命令使用
  12. 拉格朗日方程的三种推导方法之基于达朗贝尔原理推导
  13. pentaho mysql_pentaho BI Server-4.5 迁移到mysql详解
  14. 怎样用python删除excel中的_Python+Xlwings 删除Excel的行和列
  15. 计算机云维护是做什么的,IT运维是什么?云时代下的运维人员是怎样的?
  16. input type=file 禁止让用户手动输入
  17. 网关,路由,局域网内的通信及不同的网络间通信实现的原理剖析
  18. Win2003系统安装SQL Sever2000后1433端口未开放的解释
  19. c语言cdio案例,基于CDIO-OBE工程教育模式的C语言程序设计课程教学改革研究
  20. u盘文件不显示却占空间解决办法

热门文章

  1. linux之使用indent格式化代码总结
  2. Android之ANR异常及解决方法
  3. java离职交接文档_财务人员工作交接你知道么?没处理好不止将来风险大还可能违法...
  4. c语言入门数组,C语言入门之数组(2)
  5. sparkshelljarlib_Spark应用程序第三方jar文件依赖解决方案
  6. 电影院为何有散落的青瓜?
  7. 有趣程序和让人捧腹大笑的注释,你的注释还不够骚
  8. android pcm调节音量,调整PCM语音数据的音量
  9. python sqllite远程_Python实现Sqlite将字段当做索引进行查询的方法
  10. javadoc文档的生成方法_[springboot 开发单体web shop] 4. Swagger生成Javadoc