jQuery的链式调用浅析


Posted in Javascript onDecember 03, 2010

jQuery式的方法链核心部分是三点:
1)jquery的包装器函数(也就是jQuery(),以此来构建包装器对象),以此构造函数可以产生饱含了原生DOM对象的包装器对象。
它大概是这个样子的…(当然跟官方库的规模跟功能以及实现方式都差很多,我只是写了个大概的实现方式):
呃…………我的失误,请大家如果有兴趣尝试下代码记得不要引入jQuery库,命名冲突了

(function(){ 
//简化起见不支持子类选择器属性选择器等等,只接受形如".className"或者"#id"或者"tagName"以及它们之间的组合形式 自定义的工具函数(红色)会在下面说明 
function _jQuery(els){ 
this.elements = new Array(); 
for (var i = 0; i < els.length; i++) { 
var element = els[i]; 
if (typeof element == 'string') { 
element = element.trim(); //防止手抽多打入前后的空格 
var sign = element.substr(0, 1); 
if (sign == "#") { //按id查找 
element = document.getElementById(element.substr(1)); 
this.elements.push(element); 
} 
else 
if (sign == ".") { 
//按类名查找 这里用到一个自定义的按类名返回dom数组的工具函数getElementsByClassName 
element = getElementsByClassName(element.substr(1)); //element此时为数组对象,此方法为自定义见下文 
this.elements = this.elements.merge(element); 
} 
else { //无任何标识符按标签名查找 
element = document.getElementsByTagName(element); //element此时为数组对象 
this.elements = this.elements.merge(element);//这个方法可以使得elements数组中只会存在不相同的dom对象 就如同set一样 
} 
} 
else { 
this.elements.push(element); 
} 
} 
} 
/*这里可以开始扩展包装器对象的原型函数比如 
_ jQuery.prototype.addEvent=function(){………} 
*/ window['jQuery'] = function(){ return new _jQuery(arguments) }; if (!window['$']) window['$'] = window['jQuery']; })()//自执行匿名函数

OK了 插入下面这段简单html文档来测试一下(不要鄙视偶的这个html写的规范不规范…测试而已)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<title>my function addtion</title> 
</head> 
<body> 
<div id="header"> 
<p id="header1" class="entrance"> 
header1 
</p> 
<p id="header2"class="entrance"> 
header2 
</p> 
<p id="header3"class="entrance"> 
<a href="https://3water.com/index.html">header3</a> 
</p> 
</div> 
<hr/> 
<div id="content" class="news"> 
<p id="content1" class="topic"> 
node1 
</p> 
<p id="content2" class="topic"> 
node2 
</p> 
<p id="content3" class="topic"> 
<a href="https://3water.com/index.html">node3</a> 
</p> 
</div> 
<hr/> 
<div id="foot"> 
<p id="foot1" class="entrance"></p> 
</div> 
</body> 
</html>

输入:
var f=$(‘#header').elements[0]; 
consoles.write("nodeName: "+f.nodeName+"==> Id:"+f.id) 
/*自定义的代替alert的一个调试面板工具,由于在用的这个是照搬的某本书上的有点bug而且功能和操作性都不太好,过两天可能我会修改一下在放上来,自己调试可以用alert代替*/

输出:
jQuery的链式调用浅析 
输入:
var e=jQuery(' div ',' p').elements; //这里故意多输了几个空格 
for(var i=0;i<e.length;i++){ 
consoles.write("nodeName: "+e[i].nodeName+"==> Id:"+e[i].id); 
}

输出:
jQuery的链式调用浅析 
虽然整合了dom对象查找的几个方法,但是还是可以看到每次都使用循环语句来操作dom对象是一件十分烦躁的事情,并且接下来还会以此包装器为基础引入很多针对此包装器对象的方法比如上面的addEvent方法等等,这些方法的引入最终是为了操作对象中包装的原生dom对象,所以每一个方法中又必须引入for或者while语句,这个引出第二个核心函数==> jQuery.each(){}; 太晚了…明天再总结
本文使用到的工具函数(都是很有用的函数):
//className:类名 tag:在此标签名范围内寻找 parent:在此父节点内寻找 
function getElementsByClassName(className, tag, parent){ 
parent = parent || document; //缺省默认为document 
var tag = tag || '*'; //缺省默认为查找所有标签 
var elements = new Array(); 
var re = new RegExp('(^|\\s)' + className + '(\\s|$)'); 
var allList = parent.getElementsByTagName(tag); 
var element; 
for (var i = 0; i < allList.length; i++) { 
element = allList[i]; 
if (element.className.match(re)) { 
elements.push(element); 
} 
} 
return elements; 
}

if (!String.prototype.trim) {//去除首尾空格 
String.prototype.trim = function(){ 
return this.replace(/^\s+|\s+$/g, ''); 
} 
} if (!Array.prototype.merge) { 
Array.prototype.merge = function(arr){ //使得数组有类似set的特性 相同的对象无法放入同一个数组不要鄙视偶算法的问题只是阐述下原理 
for (var i = 0; i < arr.length; i++) { 
var signals=false; 
for (var j = 0; j < this.length; j++) { 
if (arr[i] == this[j]) 
signals=true; 
} 
if (!signals) this.push(arr[i]); 
} 
return this; 
} 
}
Javascript 相关文章推荐
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
jquery ui resizable bug解决方法
Oct 26 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
js+css实现导航效果实例
Feb 10 Javascript
JQuery日历插件My97DatePicker日期范围限制
Jan 20 Javascript
基于javascript实现样式清新图片轮播特效
Mar 30 Javascript
Angular-Touch库用法示例
Dec 22 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
Jan 20 Javascript
bootstrap-table组合表头的实现方法
Sep 07 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
Dec 11 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 Javascript
加速IE的Javascript document输出的方法
Dec 02 #Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 #Javascript
javascript学习之闭包分析
Dec 02 #Javascript
JavaScript OOP面向对象介绍
Dec 02 #Javascript
JavaScript 字符串处理函数使用小结
Dec 02 #Javascript
改写一个简单的菜单 弹性大小
Dec 02 #Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
Dec 02 #Javascript
You might like
如何去掉文章里的 html 语法
2006/10/09 PHP
php防攻击代码升级版
2010/12/29 PHP
jQuery学习基础知识小结
2010/11/25 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python函数返回多个值的示例方法
2013/12/04 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
深入解析Python中的线程同步方法
2016/06/14 Python
Django中Middleware中的函数详解
2019/07/18 Python
pandas-resample按时间聚合实例
2019/12/27 Python
keras之权重初始化方式
2020/05/21 Python
Python使用xpath实现图片爬取
2020/09/16 Python
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
《蜗牛》教学反思
2014/02/18 职场文书
党务公开方案
2014/05/06 职场文书
结对共建工作方案
2014/06/02 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
海洋科学专业求职信
2014/08/10 职场文书
给老婆的检讨书
2015/01/27 职场文书
初中语文教学反思范文
2016/03/03 职场文书
开网店计划分析
2019/07/30 职场文书