×

源码分析:Ready函数

作者:ceshi2017.11.27来源:Web前端之家浏览:10368评论:0
关键词:JQueryJS

这个功能在 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高很多。目前来看,Chromefirefox4都支持这个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);

您的支持是我们创作的动力!
温馨提示:本文作者系 ,经Web前端之家编辑修改或补充,转载请注明出处和本文链接:
https://jiangweishan.com/article/svg1487174400808.html

网友评论文明上网理性发言 已有0人参与

发表评论: