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针对DOM的应用分析(三)
Apr 15 Javascript
javascript删除元素节点removeChild()用法实例
May 26 Javascript
Jquery promise实现一张一张加载图片
Nov 13 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
VueJS全面解析
Nov 10 Javascript
AngularJS过滤器filter用法分析
Dec 11 Javascript
vue.js学习之vue-cli定制脚手架详解
Jul 02 Javascript
Angular 4.0学习教程之架构详解
Sep 12 Javascript
Vue.js组件实现选项卡以及切换特效
Jul 24 Javascript
layui select 禁止点击的实现方法
Sep 05 Javascript
在vue中动态添加class类进行显示隐藏实例
Nov 09 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
基于php实现的验证码小程序
2016/12/13 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Python守护进程实现过程详解
2020/02/10 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
python算的上脚本语言吗
2020/06/22 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
工厂厂长的职责
2013/12/12 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
2014年护理部工作总结
2014/11/14 职场文书
教师辞职信范文
2015/02/28 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
工作建议书范文
2019/07/08 职场文书
德劲DE1108畅想
2021/04/22 无线电
MySQL 如何设计统计数据表
2021/06/15 MySQL