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 相关文章推荐
javascript 短路法代码精简
Aug 20 Javascript
我的javascript 函数链之演变
Apr 07 Javascript
Prototype源码浅析 Number部分
Jan 16 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
AngularJS 指令的交互详解及实例代码
Sep 14 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
jquery网页日历显示控件calendar3.1使用详解
Nov 24 Javascript
Javascript实现打鼓效果
Jan 29 Javascript
vue ref如何获取子组件属性值
Mar 31 Vue.js
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之字符串变相相减的代码
2007/03/19 PHP
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP 开源框架22个简单简介
2009/08/24 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
Javascript Objects详解
2014/09/04 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
js实现全选和全不选
2020/07/28 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
详解Python的单元测试
2015/04/28 Python
Python连接DB2数据库
2016/08/27 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
python中栈的原理及实现方法示例
2019/11/27 Python
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
高二美术教学反思
2014/01/14 职场文书
员工合理化建议书
2014/05/19 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL
利用Redis实现点赞功能的示例代码
2022/06/28 Redis