pace.js 原理(转)

pace.js监控了什么:

pace.js对于加载进度监控了什么呢?通过阅读源码,我们看到整体的进度有四个部分组成:document,elements,eventLag和ajax这四种监视器(Monitor)。

1.

那接下来就来看看它们分别是什么。

首先是document。document就是我们所熟悉的HTMLDocument节点。document节点有一个事件,onreadystatechange,当document的readyState状态变化时会触发。因为无法准确的知道document到底加载了多少百分比,所以就用这个状态来做一个估算。在pace.js中将document的readyState的三个状态loadong,interactive和complete分别定义为0%,50%和100%。通过监听document节点的readyState状态变更,形成了pace.js的DocumentMonitor。

2.

接下来是elements。我们可以通过配置传入一个css选择器列表,默认的选择器列表仅包含“body”。pace.js会按照设置的时间间隔搜索所有的选择器,如果能获得则认为这一项满足,所以elements这一项的加载进度就是 满足的选择器/全部的选择器。通过查询页面中制定的元素,就是pace.js的ElementMonitor。

3.

然后是eventLag。EventLagMonitor其实只是一个“假的”监视器。它就在那里安静匀速的更新进度,这一小小的措施却带来了不错的用户体验,让用户不会因为加载“卡住了”而慌张。

pace.js是如何监控ajax的:

最后是用来监控ajax进度的AjaxMonitor。这是最有趣的一部分。如何才能监控所有ajax请求,并且不需要开发者修改自己或第三方的业务逻辑呢?

如果了解原生js的话,应该了解这几个类:XMLHttpRequest,XDomainRequest,WebSocket。这三个类分别用来发送ajax请求,跨域的ajax请求,以及websocket。如果能监控所有这些请求的时间,包括progress,load,error等等,我们就可以更新我们的加载进度了。

既然我们知道了要监控的对象,那我们便可以“请君入瓮”了,而这个瓮,就是代理模式:我们可以把原生的类保存起来,再用我们自己写的埋藏了“间谍”的类覆盖原生的类,这样当其他代码建立这些类的实例的时候,我们的“间谍”便悄悄开始监听加载进度了。

让我们来看一下代码:

// 保存原生的XMLHttpRequest
_XMLHttpRequest = window.XMLHttpRequest;

// 覆盖XMLHttpRequest
window.XMLHttpRequest = function(flags) {
    var req;
    // 调用原生的XMLHttpRequest
    req = new _XMLHttpRequest(flags);
    // 埋入我们的“间谍”
    monitorXHR(req);
    return req;
};

monitorXHR = function(req) {
  var _open;
  // “间谍”又对open方法埋入了间谍
  _open = req.open;
  return req.open = function(type, url, async) {
    if (shouldTrack(type)) {
      _this.trigger(‘request‘, {
        type: type,
        url: url,
        request: req
      });
    }
    return _open.apply(req, arguments);
  };
};

通过代理模式埋了这些“间谍”后,我们就能对发起的ajax请求等做到监控,以更新加载进度。

当然pace.js也不是什么都监听了

除了以上这些,当然也有pace.js并没有监听的加载事件,比如script标签的加载。如果我们使用了sea.js或者require.js等,当js代码动态加载时并不会影响进度条,因为这里我们用动态建立script标签的方式加载js代码,而pace.js并没有对这方面进行监听。我们可以同样的代理appendChild方法,如果发现script标签被加到页面上,那么就监听它的加载进度。不过实际情况当然复杂的多,还有insertBefore,甚至innerHTML等方法都可以创建script标签加入文档并开始js的加载(当然一般就是appendChild和insertBefore啦)。

相似的还有css的加载,还要注意处理css的加载事件,在一些老的浏览器上,css并没有加载事件,还有加个定时不断检查css节点的cssRules和name来确定加载状况。

小结:

通过阅读pace.js的源码我们了解了pace.js的原理,同时学习了鸡贼的代理模式。比如在jasmine.js中也有个spy,可以监控制定函数被调用了几次,被什么参数调用了等等。灵活应用这种代理模式,可以方便我们扩展功能、进行调试等等。

原文地址:https://www.cnblogs.com/eret9616/p/9783407.html

时间: 2024-11-04 22:59:13

pace.js 原理(转)的相关文章

pace.js原理简介

简介: 不少童鞋可能都使用过pace.js:http://github.hubspot.com/pace/docs/welcome/ 只要在页面上引入pace.js和相关的css,并不需要对业务逻辑做什么修改,就能拥有网页加载进度条,只要大家发挥想象力,那除了默认的进度条之外还能开发各种加载进度效果,使用起来非常方便. 那问题来了:pace.js是如何做到“自动”监控加载进度的呢? pace.js监控了什么: pace.js对于加载进度监控了什么呢?通过阅读源码,我们看到整体的进度有四个部分组成

pace.js和NProgress.js两个加载进度插件的一点小总结

这两个插件都是关于加载进度动画的,应该说各有特点吧,最起码对我来说是各有优势的.今天一天就捣鼓了加载进度动画,也研究了大量的(也就这两个)加载进度动画,也算对加载进度动画有了一个初步的了解了吧. NProgress.js NProgress是基于jquery的,且版本要 >1.8 API: NProgress.start() — 启动进度条 NProgress.set(0.4) — 将进度设置到具体的百分比位置 NProgress.inc() — 少量增加进度 NProgress.done() 

pace.js – 加载进度条插件

这儿只是简单介绍一下这个插件pace.js. 在页面中引入Pace.js,页面就会自动监测你的请求(包括Ajax请求),在事件循环滞后,会在页面记录加载的状态以及进度情况.此插件的兼容性很好,可以兼容IE8以上的所有主流插件,而且其强大之处在于,你还可以引入加载进度条的主题样式,你可以选择任意颜色和多种动画效果(例如简约.闪光灯,MAC OSX,左侧填充,顶部填充,计数器和弹跳等等动画效果),如果你擅长修改css动画,那你就可以做出无限种可能性的动画,为你的网站增添个性化特色! 调用方法: 引入

插件二之页面加载进度条pace.js

关于pace.js pace.js包含14样式,每种样式可以自定义颜色,官方下载中提供了几种颜色的主题,使用方式也很简单,引入pace的js文件跟所需样式文件即可 <link rel="stylesheet" href="../themes/pace-theme-center-circle.css" /> <script src="../pace.js"></script> 各样式ie下兼容要求 <!--

pace.js简介

Pace.js – 超赞的页面加载进度自动指示和 Ajax 导航效果 在页面中引入 Pace.js 和您所选择主题的 CSS 文件,就可以让你的页面拥有漂亮的加载进度和 Ajax 导航效果.不需要挂接到任何代码,自动检测进展.您可以选择颜色和多种效果,有简约,闪光灯,MAC OSX,左侧填充,顶部填充,计数器和弹跳等等. 插件下载     效果演示 本文链接:Pace.js – 超赞的页面加载进度自动指示和Ajax导航

async.js原理解析

async.js 原理解析 暂时只是针对常用的Waterfall方法 做node开发,你不能逃避的一个组件:async.js. 神奇之处在于让你用看上去同步的方式写出异步的代码,把我们从各种回调嵌套中解脱出来,程序逻辑一目了然.以下简要对async的each和waterfall方法的实现原理做介绍. async.each 先看使用方法 async.waterfall([ function(callback){ callback(null, 'one', 'two'); }, function(a

Atitit.面向接口的web&#160;原理与设计重写&#160;路由启动绑定配置url&#160;router&#160;rewriting&#160;urlpage&#160;&#160;mvc&#160;mvp的&#160;java&#160;c#.net&#160;php&#160;js

Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js 原理 通过vm带入启动参数    制定ioc配置文件 绑定各项.. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <ifra

你需要了解的JS框架

excanvas.js/Chart.js/cubism.js/d3.js/dc.js/dx.chartjs.js/echarts.js/flot.js 用途:构建数据统计图表,兼容多浏览器 jquery.tagcanvas.js       用途:构建tag云 下载地址:http://www.goat1000.com/tagcanvas.php jquery.fullPage.js      用途:网站整屏轮番 下载地址:http://www.jq22.com/jquery-info1124 案

iOS与JS交互

① iOS -> JS 原理:通过WebView的方法直接调用JS代码 [WebView stringByEvaluatingJavaScriptFromString:@"A"]; // 这里的 A 就是WebView中的html所对应的JS代码 eg. 1)这里一个html所包含的js文件内的一个public方法 2)这是一个.m(iOS)文件内的一个WebView的调用1)中js方法的写法 3)那么在js的对应方法中,就会得到来自iOS的参数 ② JS -> iOS 原