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 vvorld 在线加密破解方法
Nov 13 Javascript
编写高性能的JavaScript 脚本的加载与执行
Apr 19 Javascript
js判断变量是否未定义的代码
Mar 28 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
Jun 06 Javascript
基于WebUploader的文件上传js插件
Aug 19 Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 Javascript
vue高德地图之玩转周边
Jun 16 Javascript
Vue组件选项props实例详解
Aug 18 Javascript
详解webpack提取第三方库的正确姿势
Dec 22 Javascript
微信小程序自定义tabBar组件开发详解
Sep 24 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
node+vue实现文件上传功能
May 28 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设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
window.name代替cookie的实现代码
2010/11/28 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
详解python持久化文件读写
2019/04/06 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
Django中create和save方法的不同
2019/08/13 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
验房委托书
2014/08/30 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
2015年助残日活动总结
2015/03/27 职场文书
护士2015年终工作总结
2015/04/29 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Python基础之pandas数据合并
2021/04/27 Python