• 《阿古顿巴》藏语版在藏语卫视首播 2019-09-06
  • 晋中市“三同步”推动互联网治理创新 2019-08-27
  • 法媒:研究称美国人常用药物或增加抑郁风险 2019-08-27
  • 宝贝是地名,你能想到这么浪漫的地名在哪儿吗? 2019-08-15
  • 何树山副省长到方圆机电调研指导工作 2019-08-15
  • 中彩网3d综合分布走势图:jQuery 源码分析笔记(4) Ready函数

    来源:本网整理
    这个功能在 jQuery的文档中提到了三种等价的形式:
    复制代码 代码如下:
    // 定义在jQuery.fn.ready
    $(document).ready(handler);
    // 和上一个是同一个,不推荐
    $().ready(handler);
    // 单独在jQuery对象中处理
    $(handler);
    // 以上这个形式的定义:
    if(jQuery.isFunction(selector) {
    return rootjQuery.ready(selector);
    }

    因此实际上都归结与一个形式:jQuery.fn.ready(fn)。定义如下:
    复制代码 代码如下:
    ready: function(fn) {
    // 绑定事件到DOM上
    jQuery.bindReady();
    // 触发回调函数
    readyList.done(fn);
    // 返回jQuery对象
    return this;
    }

    实际上jQuery内部并不仅仅只有一个对fn的引用。这里用到了 Deferred功能。在75行,为jQuery对象定义了readyList成员。而在442行在bindReady函数中初始化了这个变量:
    复制代码 代码如下:
    if(readyList) {
    return;
    }
    readyList = jQuery._Deferred();

    bindReady函数除了初始化readyList之外,主要处理了浏览器对于绑定事件的区别。IE使用attachEvent而其他浏览器使用addEventHandler。这两个步骤完成后,ready函数使用readyList.resolveWith 触发回调函数。除了这个工作外,ready还处理了holdReady。这个API 的作用是延迟ready事件的回调,主要目的是在ready事件前做点事情。holdReady设置了一个标志位readyWait。当这个标志位被设置之后,ready在调用readyList.resolveWith之前不停地调用setTimeout(jQuery.ready, 1)。即每隔固定时间就递归调用自己(不知道hold时间久了,js引擎会不会栈溢出),这样最后被holdReady释放的时候, setTimeout会沿着调用栈回来的。为了在这个栈完成之前不触发ready回调函数。在每次调用setTimeout的时候,会递增readyWait变量。用来指示被holdReady函数延误了几次调用。


    ###几个基础辅助函数
    在543行开始,定义了几个值得注意的辅助函数:parseJSON,parseXML和globalEval。parseJSON把一个字符串变成JSON对象。我们一般使用的是eval。parseJSON封装了这个操作,但是eval被当作了最后手段。因为最新JavaScript标准中加入了JSON序列化和反序列化的API。如果浏览器支持这个标准,则这两个API是在JS引擎中用Native Code实现的,效率肯定比eval高很多。目前来看,Chrome和Firefox4都支持这个API。parseJSON使用如下:
    复制代码 代码如下:
    // 原生JSON API。反序列化是JSON.stringify(object)
    if(window.JSON && window.JSON.parse) {
    return window.JSON.parse(data);
    }
    // ... 大致地检查一下字符串合法性
    return (new Function("return " + data))();

    parseXML函数也主要是标准API和IE的封装。标准API是DOMParser对象。而IE使用的是Microsoft.XMLDOM的 ActiveXObject对象。定义:
    复制代码 代码如下:
    if(window.DOMParser) {
    tmp = new DOMParser();
    xml = tmp.parseFromString(data, "text/xml");
    } else {
    xml = new ActiveXObject("Microsoft.XMLDOM");
    xml.async = "false";
    xml.loadXML(data);
    }

    globalEval函数把一段脚本加载到全局context中。IE中可以使用window.execScript。其他浏览器需要使用eval。因为整个jQuery代码都是一整个匿名函数,所以当前context是jQuery。主要代码:
    复制代码 代码如下:
    (window.execScript || function(data) {
    window["eval"].call(window, data); // 在window context下运行
    })(data);

    彩票双色球历史开奖结果 www.s9h6.com

  • 本文相关:
  • 精通Javascript系列之数值计算
  • 精通Javascript系列之Javascript基础篇
  • 精通Javascript系列之数据类型 字符串
  • jquery 跨域访问问题解决方法(笔记)
  • jQuery中的.bind()、.live()和.delegate()之间区别分析
  • jQuery 源码分析笔记(6) jQuery.data
  • 10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
  • 基于jquery的无刷新分页技术
  • 读jQuery之一(对象的组成)
  • 读jQuery之二(两种扩展)
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 彩票双色球历史开奖结果 - 频道导航
    Copyright © 2017 彩票双色球历史开奖结果 www.s9h6.com All Rights Reserved
  • 《阿古顿巴》藏语版在藏语卫视首播 2019-09-06
  • 晋中市“三同步”推动互联网治理创新 2019-08-27
  • 法媒:研究称美国人常用药物或增加抑郁风险 2019-08-27
  • 宝贝是地名,你能想到这么浪漫的地名在哪儿吗? 2019-08-15
  • 何树山副省长到方圆机电调研指导工作 2019-08-15
  • 6加1开奖结果查询 怎么买辽宁十一选五开奖结果 篮球让分胜负单关 360时时彩倍投器 11选5每期7码必出五码 大西洋万炮捕鱼 500彩票网股东 广东36选7开奖中奖 4场进球玩法中多少钱 山东11选5中奖纪录 秒速时时彩技巧公式 福彩主任1360亿 pc蛋蛋可信吗 利用名片赚钱的方法 时时彩龙虎洗返水