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 相关文章推荐
一个对于Array的简单扩展
Oct 03 Javascript
如何让div span等元素能响应键盘事件操作指南
Nov 13 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 Javascript
微信小程序如何实现在线客服功能
Oct 16 Javascript
vue路由跳转传递参数的方式总结
May 10 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
JS相册图片抖动放大展示效果的示例代码
Jan 29 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php 变量定义方法
2009/06/14 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
python获取交互式ssh shell的方法
2019/02/14 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
python sqlite的Row对象操作示例
2019/09/11 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
岗位职责风险点
2014/03/12 职场文书
小学生优秀评语大全
2014/04/22 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
网吧消防安全责任书
2014/07/29 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
python入门之算法学习
2021/04/22 Python
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
Nginx速查手册及常见问题
2022/04/07 Servers
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers