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 相关文章推荐
优化javascript的执行效率一些方法总结
Dec 25 Javascript
深入分析Javascript跨域问题
Apr 17 Javascript
JavaScript为事件句柄绑定监听函数实例详解
Dec 15 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
JavaScript实现多栏目切换效果
Dec 12 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
Node.js assert断言原理与用法分析
Jan 04 Javascript
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 jQuery
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
Dec 28 Javascript
js基于canvas实现时钟组件
Feb 07 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 header Content-Type类型小结
2011/07/03 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
Yii框架登录流程分析
2014/12/03 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
php自定义时间转换函数示例
2016/12/07 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
Python random模块用法解析及简单示例
2017/12/18 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
建筑自我鉴定
2013/10/19 职场文书
市场营销毕业生自荐信
2013/11/23 职场文书
测控技术自荐信
2014/06/05 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
班主任经验交流材料
2014/12/16 职场文书
春季运动会开幕词
2015/01/28 职场文书
防暑降温通知书
2015/04/27 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书