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动态添加onclick事件可传参数与不传参数
Jul 29 Javascript
WEB 前端开发中防治重复提交的实现方法
Oct 26 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
JS+Ajax实现百度智能搜索框
Aug 04 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
详解JavaScript作用域和作用域链
Mar 19 Javascript
在vue中使用jsx语法的使用方法
Sep 30 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 Javascript
JavaScript代理模式原理与用法实例详解
Mar 10 Javascript
vue2.0实现列表数据增加和删除
Jun 17 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第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
微信小程序时间轴实现方法示例
2019/01/14 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
Python 异常处理实例详解
2014/03/12 Python
Python中的装饰器用法详解
2015/01/14 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
Python多分支if语句的使用
2020/09/03 Python
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
六十岁生日答谢词
2014/01/10 职场文书
一年级学生评语大全
2014/04/21 职场文书
2014年实习生工作总结
2014/11/27 职场文书
学习保证书怎么写
2015/02/26 职场文书
实名检举信范文
2015/03/02 职场文书
2019个人半年工作总结
2019/06/21 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
使用Python解决图表与画布的间距问题
2022/04/11 Python