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 load()加载GB2312页面时出现乱码的两种方案
Sep 10 Javascript
javascript日期格式化示例分享
Mar 05 Javascript
jquery ui bootstrap 实现自定义风格
Nov 14 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
DOM操作一些常用的属性汇总
Mar 13 Javascript
js数组去重的方法汇总
Jul 29 Javascript
简单实现jQuery轮播效果
Aug 18 jQuery
Vue触发式全局组件构建的方法
Nov 28 Javascript
vue+iview/elementUi实现城市多选
Mar 28 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
node.js开发辅助工具nodemon安装与配置详解
Feb 06 Javascript
Element PageHeader页头的使用方法
Jul 26 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使用exec shell命令注入的方法讲解
2013/11/12 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
展会邀请函范文
2014/01/26 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
财产保全担保书范文
2014/04/01 职场文书
小区文明倡议书
2014/05/16 职场文书
安全生产先进个人总结
2015/02/15 职场文书
工资证明范本
2015/06/12 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
Mysql 一主多从的部署
2022/05/20 MySQL