这段添加的方法有:

  • 各类事件函数
  • 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. SSH整合!!!!不会的赶紧来

    说到SSH也就是Spring,struts2,Hibernate三大框架那么咱们话不多说开始搭建吧 首先我们这个项目的目的是应用三大框架将一个商品的信息保存到数据库中. 第一步就是创建Web项目,引入 ...

  2. Redmine CodeReview

    Windows Bitnami Redmine通过自带必要的RoR依赖,解决了Redmine安装困难的问题,但也带来了很多Redmine的文档无法使用到Bitnami的问题.原因应该是很多命令不在用户 ...

  3. 【JS】键盘鼠标事件

    一,键盘 keydown 表示按下键盘 keypress 表示按下键盘 keyup 表示键盘弹起 这三者的区别分别表现在发生的 先后顺序,获取到的键盘按钮值,已经对输入框的文本取值这三方面 先后顺序: ...

  4. CSS3 transition效果 360度旋转 旋转放大 放大 移动

    效果一:360°旋转 修改rotate(旋转度数) * { transition:All 0.4s ease-in-out; -webkit-transition:All 0.4s ease-in-o ...

  5. Git Windows客户端保存用户名与密码

    1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的文件. 3. 用记事本打开_n ...

  6. PHP连接MySQL数据库

    PHP连接MySQL数据库 既然现在你看到了这篇文章,说明你肯定知道PHP和MySQL是怎么一回事,我就不啰嗦了.但为什么你还要继续阅读此文呢?可能是以前你习惯复制粘贴一些代码,并没有真正弄懂代码的含 ...

  7. IplImage结构体

    一.IplImage的一些重要成员: 1.origin:图像原点的定义.=0,则图片的左上角是原点:=1,则左下角是原点.                                  IplIm ...

  8. CSS hack方式一览【转】

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  9. Repeater 根据某一列的值加颜色

    //排队中 protected void rptOrdersList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterIt ...

  10. 关于C语言的问卷调查(补交)

    你对自己的未来有什么规划?做了哪些准备?(还是处于比较迷茫的状态:我做的准备是吧自己对计算机的兴趣提起来!) 你认为什么是学习?学习有什么用?现在学习动力如何?为什么?(学习就是学自己不会的东西:增加 ...