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新手语法小结
Jun 15 Javascript
JS中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
JS判定是否原生方法
Jul 22 Javascript
从零学JS之你需要了解的几本书
May 19 Javascript
JQUERY简单按钮轮换选中效果实现方法
May 07 Javascript
JavaScript访问字符串中单个字符的两种方法
Jul 03 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
Mar 30 Javascript
Angular实现购物车计算示例代码
Feb 21 Javascript
jquery Form轻松实现文件上传
May 24 jQuery
微信小程序的分类页面制作
Jun 27 Javascript
让Vue也可以使用Redux的方法
May 23 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 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中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
Python 字符串定义
2009/09/25 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python跳出双层for循环的解决方法
2019/06/24 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
pandas的resample重采样的使用
2020/04/24 Python
python2和python3哪个使用率高
2020/06/23 Python
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
Java程序员常见面试题
2015/07/16 面试题
护理专业本科生自荐信
2013/10/01 职场文书
保险专业大专生求职信
2013/10/26 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
财务总监岗位职责
2014/03/07 职场文书
开学典礼演讲稿
2014/05/23 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python