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 多级checkbox选择效果
Aug 20 Javascript
关于document.cookie的使用javascript
Oct 29 Javascript
网页整体变灰白色(兼容各浏览器)实例
Apr 21 Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 Javascript
jQuery实现tab标签自动切换的方法
Feb 28 Javascript
javascript拖拽应用实例(二)
Mar 25 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
Jan 11 Javascript
JS实现多张图片预览同步上传功能
Jun 23 Javascript
vue.js select下拉框绑定和取值方法
Mar 03 Javascript
vue2.0 中使用transition实现动画效果使用心得
Aug 13 Javascript
layui数据表格 table.render 报错的解决方法
Sep 29 Javascript
node.js中path路径模块的使用方法实例分析
Feb 13 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
微信支付开发告警通知实例
2016/07/12 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python3判断url链接是否为404的方法
2018/08/10 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
django实现用户注册实例讲解
2019/10/30 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
春风行动实施方案
2014/03/28 职场文书
医学求职自荐信
2014/06/21 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP