这段添加的方法有:

  • 各类事件函数
  • css()
  • addEvent()
  • toggle()
//添加各种事件,将常用的事件名称放入数组,然后循环着加入到zQuery对象的原型上
var eventArr = ['click','mouseover','mouseout','mousemove','contextmenu','mouseenter','mouseleave'];
for(var i=0; i<eventArr.length; i++){ //因为循环里套了一层函数,所以用函数自执行,把每次循环的i传入
(function(index){
zQuery.prototype[eventArr[i]] = function(fn){
for(var i=0; i<this.elements.length; i++){
addEvent(this.elements[i],eventArr[index],fn);
}
};
})(i);
} //样式设置css();因为是方法,写在原型上
zQuery.prototype.css = function(arg1,arg2){
if(arguments.length == 2){
for(var i=0; i<this.elements.length; i++){
this.elements[i].style[arg1] = arg2;
}
}else{
if(typeof arg1 == 'string'){
return getStyle(this.elements[0],arg1);//根据jQuery,返回样式都是返回集合中的第0个元素,如果获取不到就获取第二个,这里就默认能够获取到第0个
}else if(typeof arg1 == 'object'){//参数也可以是个json,批量设置值
for(var i=0; i<this.elements.length; i++){
for(var key in arg1){
this.elements[i].style[key] = arg1[key];
}
}
}
}
} function addEvent(obj,sEvt,fn){
if(obj.addEventListener){
obj.addEventListener(sEvt,function(ev){
if(fn.call(obj,ev) == false){ //注意这里的this指向以及ev的传递,这句话不但执行了函数,还对函数执行后的返回值进行了判断,看看是不是fn里有return false,按照jQ的写法,return false是既阻止默认事件又取消冒泡的
ev.stopPropagation();
ev.preventDefault();
}
},false);
}else{
obj.attachEvent('on' + sEvt,function(){
if(fn.call(obj,event) == false){
event.cancelBubble = true;
event.returnValue = false;
}
});
}
} //toggle,toggle函数是在函数里传若干个参数,每个参数都是函数,调用的时候一次调用
zQuery.prototype.toggle = function(){
var args = arguments; //先把参数集合存进来
for(var i=0; i<this.elements.length; i++){
this.elements[i].count = 0;//给每个点击的元素身上绑定一个属性count,这里的this是oo对象,
addEvent(this.elements[i],'click',function(ev){
if(args[this.count % args.length].call(this,ev)==false){
/*
1) 如果这里不用call,则this指代的是arguments这个对象,就这个对象调用了函数,但是为了让this指向被点击的元素,所以要call里传一下this,这里的this,应该是被点击的对象this.elements中的每一个。记住,在事件绑定函数中,this就是指代被绑定的那个元素
2) count也是每个元素身上自带的
3) 这句代码,一方面执行了函数,而且还对函数的返回值进行了判断
4)this.elements本身是对象oo中的一个属性,
*/
ev.cancelBubble = true;
}
this.count++;
});
}
};

【学】jQuery的源码思路3——添加事件及其他的更多相关文章

  1. 【学】jQuery的源码思路1——后代选择器

    jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...

  2. 【学】jQuery的源码思路2——$符号是如何封装的

    jQuery中的$符号功能很强大,原因在于对函数参数的个数以及种类的控制,还有对于面向对象思想的运用 function jQuery(args){ //接受参数,并对其判断 this.elements ...

  3. 【学】jQuery的源码思路4——增加一些功能

    本文说一些简单的jQuery实现原理 eq() get() hide() show() index() find() //返回找到的一组元素中的第n个 zQuery.prototype.eq=func ...

  4. 【学】jQuery的源码思路6——增加each,animaion,ajax以及插件机制

    each() 插件机制 animation ajax //each() //这里第一个参数指定将this指向每次循环到的那个元素身上,而第三个参数element其实就是this本身所以和第一个参数是一 ...

  5. 【学】jQuery的源码思路5——增加class的操作

    hasClass, addClass, removeClass, toggleClass //addClass,加入class会对元素,利用正则,将class中多余的空格去掉 zQuery.proto ...

  6. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  7. jQuery.attributes源码分析(attr/prop/val/class)

    回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和p ...

  8. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. 深入分析,理解jQuery.Deferred源码

    前言: 如果你对jQuery.Callback回调对象不了解,或者只掌握其方法,但是没有通过阅读源码理解,可以先阅读 前一章jQuery.Callbacks源码解读二,因为只有完全理解jQuery.C ...

随机推荐

  1. 黑马----JAVA异常

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...

  2. JavaScript HTML CSS外部链接

    HTML文件 <!--<html> <head><link rel="stylesheet" type="text/css" ...

  3. eclipse中jre system library ,web app libraries,referenced libraries,user libraries

    在eclipse ide中进行开发时,为了方面jar的管理用了user libraries,但是遇到了一些问题,对于其中jre system library ,web app libraries,re ...

  4. pysproto bug修复

    最近,找隔壁组的同学测试了一下我的pysproto,他们提了很多有益的建议,非常感谢. 在测试中,出现了一次诡异的coredump.当数据变大的时候,就有很大的机率遇上double free.在spr ...

  5. Nginx Debug Log

    //检查nginx.conf时(sudo ./nginx -t),输出数据到检测结果 //ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "配置解析处理&q ...

  6. AIX上通过IPSEC进行IP包过滤

    AIX上的IPSEC 在AIX可以通过以下步骤打开IP Security smitty ipsec4 --> Start/Stop IP Security --> Start IP Sec ...

  7. python数据结构与算法——哈希表

    哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity00 ...

  8. 413 Request Entity Too Large

    做小视频上传,结果接口总是返回500,服务器端跟踪,根本就进不来,再次翻查,发下服务器返回的其实是413,只不过APP底层接口将所有不是200的回包都转成500了,问题定位. 有了错误码,有了描述,字 ...

  9. Java 第十周学习总结

    20145113<Java程序设计>第十周学习总结 基础知识 1.网络通讯的方式主要有两种 TCP(传输控制协议)方式:需要建立专用的虚拟连接以及确认传输是否正确 UDP(用户数据报协议) ...

  10. 【python】jiraAPI使用教程 自动创建jira问题单并置状态为OPEN

    环境依赖 : python库 redis jira  安装命令:pip install redis pip install jira redis服务安装命令: $sudo apt-get update ...