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 相关文章推荐
Js 弹出框口并返回值的两种常用方法
Dec 30 Javascript
IE6、IE7中获取Button元素的值的bug说明
Aug 28 Javascript
动态加载JS文件的三种方法
Nov 08 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
Feb 05 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 Javascript
jQuery 实时保存页面动态添加的数据的示例
Aug 14 jQuery
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
解决layui-open关闭自身窗口的问题
Sep 10 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 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
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
Jquery replace 字符替换实现代码
2010/12/02 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
js微信支付实现代码
2016/12/22 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
JavaScript闭包相关知识解析
2019/10/19 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
python列表去重的二种方法
2014/02/14 Python
使用python实现省市三级菜单效果
2016/01/20 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
Python中如何获取类属性的列表
2016/12/26 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
python实现单向链表详解
2018/02/08 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
PHP笔试题
2012/02/22 面试题
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
电气专业推荐信范文
2013/11/18 职场文书
后勤主管岗位职责
2014/03/01 职场文书
实习工作表现评语
2014/12/31 职场文书
论文致谢词范文
2015/05/14 职场文书
电力安全学习心得体会
2016/01/18 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
python 三边测量定位的实现代码
2021/04/22 Python