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 相关文章推荐
在网页里看flash的trace数据的js类
Jan 10 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
Oct 10 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
Jan 24 Javascript
通过一段代码简单说js中的this的使用
Jul 23 Javascript
详解Vue路由开启keep-alive时的注意点
Jun 20 Javascript
使用watch监听路由变化和watch监听对象的实例
Feb 24 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
Sep 17 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 Javascript
Jquery $.map使用方法实例详解
Sep 01 jQuery
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中explode与split的区别介绍
2012/10/03 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
PHP安全下载文件的方法
2016/04/07 PHP
ajax请求get与post的区别总结
2013/11/04 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
Vue实现购物车功能
2017/04/27 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
Python中包的用法及安装
2020/02/11 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
学生学习总结的自我评价
2013/10/22 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
房屋出租协议书
2014/04/10 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
高三语文复习计划
2015/01/19 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
学校捐书倡议书
2015/04/27 职场文书
结婚幸福感言
2015/08/01 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android