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 全角转换实现代码
Jul 17 Javascript
javascript getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
May 12 Javascript
JQuery+EasyUI轻松实现步骤条效果
Feb 22 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
vue 项目常用加载器及配置详解
Jan 22 Javascript
vue组件中使用props传递数据的实例详解
Apr 08 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
vue路由跳转传参数的方法
May 06 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
php cookie的操作实现代码(登录)
2010/12/29 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
Python字符串转换成浮点数函数分享
2015/07/24 Python
用Python 执行cmd命令
2020/12/18 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
教育英语专业毕业生的求职信
2014/03/13 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
个人工作保证书
2015/02/28 职场文书
新学期感想
2015/08/10 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技