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 相关文章推荐
用jQuery实现检测浏览器及版本的脚本代码
Jan 22 Javascript
jQuery 方法大全方便学习参考
Feb 25 Javascript
8个实用的jQuery技巧
Mar 04 Javascript
javascript实现连续赋值
Aug 10 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
JS区分浏览器页面是刷新还是关闭
Apr 17 Javascript
在vue中实现简单页面逆传值的方法
Nov 27 Javascript
基于vue+canvas的excel-like组件实例详解
Nov 28 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
详解webpack打包第三方类库的正确姿势
Oct 20 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 Javascript
jQuery 实现扁平式小清新导航
Jul 07 jQuery
加速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安装攻略:常见问题解答(二)
2006/10/09 PHP
php 远程关机操作的代码
2008/12/05 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
php异常处理捕获错误整理
2019/09/23 PHP
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
JavaScript实现美化滑块效果
2019/05/17 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
python基于socket实现网络广播的方法
2015/04/29 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
python队列原理及实现方法示例
2019/11/27 Python
Python中six模块基础用法
2019/12/08 Python
基于python监控程序是否关闭
2020/01/14 Python
Python里面如何拷贝一个对象
2014/02/17 面试题
普通员工辞职信
2014/01/17 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
学籍证明模板
2014/11/21 职场文书
工人先进事迹材料
2014/12/26 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
生日寿星公答谢词
2015/09/29 职场文书
初三英语教学反思
2016/02/15 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers