jQuery的实现原理的模拟代码 -1 核心部分


Posted in Javascript onAugust 01, 2010

核心部分实现了两种选择器,使用 id 和标记名,还可以提供 css 的设置,以及 text 的设置。

// # 表示在 jQuery 1.4.2 中对应的行数 
// 定义变量 undefined 方便使用 
var undefined = undefined; 
// jQuery 是一个函数,其实调用 jQuery.fn.init 创建对象 
var $ = jQuery = window.$ = window.jQuery // #19 
= function (selector, context) { 
return new jQuery.fn.init(selector, context); 
}; 
// 用来检查是否是一个 id 
idExpr = /^#([\w-]+)$/; 
// 设置 jQuery 的原型对象, 用于所有 jQuery 对象共享 
jQuery.fn = jQuery.prototype = { // #74 
length: 0, // #190 
jquery: "1.4.2", // # 187 
// 这是一个示例,仅仅提供两种选择方式:id 和标记名 
init: function (selector, context) { // #75 
// Handle HTML strings 
if (typeof selector === "string") { 
// Are we dealing with HTML string or an ID? 
match = idExpr.exec(selector); 
// Verify a match, and that no context was specified for #id 
if (match && match[1]) { 
var elem = document.getElementById(match[1]); 
if (elem) { 
this.length = 1; 
this[0] = elem; 
} 
} 
else { 
// 直接使用标记名 
var nodes = document.getElementsByTagName(selector); 
for (var l = nodes.length, j = 0; j < l; j++) { 
this[j] = nodes[j]; 
} 
this.length = nodes.length; 
} 
this.context = document; 
this.selector = selector; 
return this; 
} 
}, 
// 代表的 DOM 对象的个数 
size: function () { // #193 
return this.length; 
}, 
// 用来设置 css 样式 
css: function (name, value) { // #4564 
this.each( 
function (name, value) { 
this.style[name] = value; 
}, 
arguments // 实际的参数以数组的形式传递 
); 
return this; 
}, 
// 用来设置文本内容 
text: function (val) { // #3995 
if (val) { 
this.each(function () { 
this.innerHTML = val; 
}, 
arguments // 实际的参数以数组的形式传递 
) 
} 
return this; 
}, 
// 用来对所有的 DOM 对象进行操作 
// callback 自定义的回调函数 
// args 自定义的参数 
each: function (callback, args) { // #244 
return jQuery.each(this, callback, args); 
} 
} 
// init 函数的原型也就是 jQuery 的原型 
jQuery.fn.init.prototype = jQuery.prototype; // #303 
// 用来遍历 jQuery 对象中包含的元素 
jQuery.each = function (object, callback, args) { // #550 
var i = 0, length = object.length; 
// 没有提供参数 
if (args === undefined) { 
for (var value = object[0]; 
i < length && callback.call(value, i, value) !== false; 
value = object[++i]) 
{ } 
} 
else { 
for (; i < length; ) { 
if (callback.apply(object[i++], args) === false) { 
break; 
} 
} 
} 
}

在 jQuery 中, jQuery 对象实际上是一个仿数组的对象,代表通过选择器得到的所有 DOM 对象的集合,它像数组一样有 length 属性,表示代表的 DOM 对象的个数,还可以通过下标进行遍历。

95 行的 jQuery.each 是 jQuery 中用来遍历这个仿数组,对其中的每个元素进行遍历处理的基本方法,callback 表示处理这个 DOM 对象的函数。通常情况下,我们并不使用这个方法,而是使用 jQuery 对象的 each 方法进行遍历。jQuery 对象的 css 和 text 方法在内部实际上使用 jQuery 对象的 each 方法对所选择的元素进行处理。

这些函数及对象的关系见:jQuery 原型关系图
jQuery的实现原理的模拟代码 -1 核心部分

下面的脚本使用这个脚本库。

// 原型操作 
$("h1").text("Hello, world.").css("color", "green");
Javascript 相关文章推荐
js控制不同的时间段显示不同的css样式的实例代码
Nov 04 Javascript
js判断浏览器类型为ie6时不执行
Jun 15 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
JavaScript的字符串方法汇总
Jul 31 Javascript
微信小程序利用co处理异步流程的方法教程
May 20 Javascript
vue2.0 axios跨域并渲染的问题解决方法
Mar 08 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 Javascript
详解vuex状态管理模式
Nov 01 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
Sep 16 Javascript
es6中let和const的使用方法详解
Feb 24 Javascript
jQuery validate 中文API 附validate.js中文api手册
Jul 31 #Javascript
jQuery对象[0]是什么含义?
Jul 31 #Javascript
动态调用CSS文件的JS代码
Jul 29 #Javascript
date.parse在IE和FF中的区别
Jul 29 #Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
Jul 29 #Javascript
jquery中对表单的基本操作代码
Jul 29 #Javascript
jquery下利用jsonp跨域访问实现方法
Jul 29 #Javascript
You might like
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
常规表格多表头查询示例
2014/02/21 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
python实现内存监控系统
2021/03/07 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
护理职业生涯规划书
2014/01/24 职场文书
优秀员工演讲稿
2014/05/19 职场文书
人力资源管理求职信
2014/08/07 职场文书
企业员工集体活动方案
2014/08/17 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
上课说话检讨书
2015/01/27 职场文书
社会实践活动报告
2015/02/05 职场文书
2015年教师节活动总结
2015/03/20 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python