vConsole源码阅读报告

vConsole解决的三个关键问题

  1. 如何捕捉错误
  2. 如何输出循环定义对象
  3. 如何捕捉ajax请求

如何捕捉错误

使用window.onerror = function(message, source, lineno, colno, error) { ... }来捕捉JavaScript运行时错误(包括语法错误)。

以下信息来自MDN

函数参数为:  
- message:错误信息(字符串)。Available as event (sic!) in HTML onerror="" handler.
- source:发生错误的脚本URL(字符串)
- lineno:发生错误的行号(数字)
- colno:发生错误的列号(数字)
- error:Error对象(对象)  
若该函数返回true,则阻止执行默认事件处理函数。 

跨域脚本的错误捕捉

对跨域脚本需加crossorigin属性,比如这个样子<script crossorigin />
然后对js文件添加跨域header属性,比如这个样子Access-Control-Allow-Origin: *添加方法点我

如何输出循环定义对象

循环定义的对象输出,原生APIJSON.Stringify()会报错,报错信息为Uncaught TypeError: Converting circular structure to JSON
判断对象是否循环定义的思路是,子节点的引用跟其祖先的引用相同。
参考vConsoletool.jsJSONStringify方法。

如何捕捉ajax请求

最基本的ajax代码如下:

var httpRequest = null;
httpRequest = new XMLHttpRequest();
httpRequest.overrideMimeType('text/json');
httpRequest.onreadystatechange = function(){
  /*
  0 UNSENT (未打开)    open()方法还未被调用.
  1 OPENED  (未发送)   send()方法还未被调用.
  2 HEADERS_RECEIVED (已获取响应头)   send()方法已经被调用, 响应头和响应状态已经返回.
  3 LOADING (正在下载响应体)   响应体下载中; responseText中已经获取了部分数据.
  4 DONE (请求完成) 整个请求过程已经完毕.
  */
  if (httpRequest.readyState == 4) {
    // 200(OK)
    // 404(Not Found) or 500(Internal Error)
    if (httpRequest.status == 200) { 
      var responseText = httpRequest.responseText;

    } else {
      
    }
  } else {

  }
};
httpRequest.open('GET', 'xxx.json', true);
httpRequest.send(null);

这里涉及到ajax相关信息有,请求地址(url),请求方法(method),请求参数,请求状态,请求时间,请求Headers信息,响应内容。
获取上述信息的途径有:

  • window.XMLHttpRequest.prototype.open方法中可以获取到请求地址(url),请求方法(method)信息。
  • window.XMLHttpRequest.prototype.send方法中可以获取到POST请求的请求参数信息。
    如果是GET请求,需对请求地址(url)的查询字符串进行解析处理。
  • window.XMLHttpRequest.prototype.status属性即为请求状态
  • 获取ajax请求所消耗时间,只需在onreadystatechange方法中的DONE阶段声明的时间 减去 在UNSENT阶段声明的时间即可。
  • 通过window.XMLHttpRequest.prototype.getAllResponseHeaders方法可获取到请求Headers信息
  • window.XMLHttpRequest.prototype.response属性即为响应内容
    根据响应内容的类型responseType的值text,json,blob,document,arraybuffer做对应的字符串格式化。

参考vConsolenewtwork.jsmockAjax方法。

其它

chrome跑example页面发现报Cannot read property 'trigger' of undefined错误。
原因是zepto.touch.min.js使用了pointer事件。
关于pointer事件,参考这个链接
pointer事件用来统一鼠标(mouse)、触摸屏(touch)、触控笔(pen)三者的交互事件。
chrome未完善支持,导致报错。

  1. 判断网页文档准备情况。
if (document !== undefined) {
  if (document.readyState == 'complete') {
    _onload();
  } else {
    $.bind(window, 'load', _onload);
  }
} else {
  // if document does not exist, wait for it
  let _timer;
  let _pollingDocument = function() {
    if (document && document.readyState == 'complete') {
      _timer && clearTimeout(_timer);
      _onload();
    } else {
      _timer = setTimeout(_pollingDocument, 1);
    }
  };
  _timer = setTimeout(_pollingDocument, 1);
}

可参考这个链接

render panel DOM
把core.html里面的节点渲染到页面上。
这里有个element.insertAdjacentElement方法,详细参考此链接

log输出三种形式,如果是function,直接通过其toString方法输出。如果是字符串,需经过htmlEncode后输出。
如果是对象或者数组。
首先输出类型名称和预览(少于26个字符)
遍历对象下属的key和对应的vlaue,value类型。
获取对象的prototype nameObject.prototype.toString.call(obj).replace('[object ', '').replace(']', '');

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容

  • 五十三:请解释 JavaScript 中 this 是如何工作的。1.方法调用模式当一个函数被保存为一个对象的属性...
    Arno_z阅读 579评论 0 2
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,771评论 2 17
  • 为啥总是要吐槽他人的闲话? 1、她是个爱讲闲话的人,如果对于她每说的一句闲话,我都评价,那我岂不是成为跟她一样爱讲...
    不断变强的兔子阅读 278评论 0 0
  • 有个朋友很奇怪,说自己从入职开始,自己的经理就不喜欢自己,事情一直需要自己做,任务也给安排的很重,但是一直对自己就...
    范先生说阅读 889评论 0 0
  • 在辅导班里看见的这本书,被名字吸引,就拿过来看,是加里格卡夫曼的自传。不知道以前看谁说过一句话,要看书就要看自传而...
    红豆抹茶味儿阅读 92评论 0 0