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 相关文章推荐
jquery-easyui关闭tab自动切换到前一个tab
Jul 29 Javascript
事件模型在各浏览器中存在差异
Oct 20 Javascript
简单实用jquery版三级联动select示例
Jul 04 Javascript
JS替换字符串中空格方法
Apr 17 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
Sep 10 Javascript
JavaScript事件代理和委托详解
Apr 08 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
Apr 10 Javascript
jquery dataTable 获取某行数据
May 05 jQuery
Node学习记录之cluster模块
May 31 Javascript
vue-cli构建项目使用 less的方法
Oct 04 Javascript
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
Aug 28 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 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
javascript 写类方式之三
2009/07/05 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python实现爬取逐浪小说的方法
2015/07/07 Python
python实现发送邮件功能代码
2017/12/14 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
恶意软件的定义
2014/11/12 面试题
技术合作协议书范本
2014/04/18 职场文书
会计专业自荐书
2014/07/08 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
mysql事务对效率的影响分析总结
2021/10/24 MySQL
MySQL读取JSON转换的方式
2022/03/18 MySQL