JQuery分析及实现part5之事件模块功能及实现
JQuery模块分析及其实现第五部分事件部分功能及实现,接第四部分!
remove 方法
- 功能:将筛选出来的所有
dom元素删除掉 - 实现思路
- 遍历
this上的所有dom元素; - 获取当前
dom元素的父节点,调用removeChild方法删除自己; - 循环结束,返回
this.
- 遍历
remove: function() {
return this.each(function() {
this.parentNode.removeChild(this);
});
},
empty 方法
- 功能:将筛选出来的所有
dom元素,清空后代节点 - 实现思路
- 遍历
this上的所有dom元素; - 直接给当前
dom元素的innerHTML属性赋值为空字符串; - 循环结束,返回
this,实现链式编程.
- 遍历
empty: function() {
return this.each(function() {
this.innerHTML = '';
});
}
以上接第四部分 dom 操作模块
事件部分begin
事件绑定
-
DOM 0方式
- 通过
dom元素的on + 事件名属性来绑定事件,并且赋值为 一个字符串; - 上述字符串为 执行该事件的代码块(逻辑);
- 缺点:可读性以及可维护性不好.
- 通过
-
DOM 0方式的加强版
- 通过
dom元素的on + 事件名属性来绑定事件,并且赋值为 一个事件处理函数; - 缺点:定义很多的全局函数,容易造成内存过大的损耗,依然没有解决
js代码和html的耦合度关系;
- 通过
-
IE标准
- 通过
attachEvent来绑定事件; - 语法:
dom.attachEvent(type, callback); - 移除事件:
detachEvent(type, callback);- 注意:如果想要删除某个事件的处理函数,不能将该处理函数定义为匿名的
- 通过
-
W3C标准
- 通过
addEventListener方法来给dom元素绑定事件; - 语法:
dom.addEventListener(type, callback, useCapture默认值为false); - 移除事件:
removEventListener(type, callback);- 注意:如果想要删除某个事件的处理函数,不能将该处理函数定义为匿名的
- 通过
-
事件流
- 概念: 用户在触发某一动作时,页面所做相关反映的过程
- 三个阶段:
- 事件捕获阶段
- 处于事件源阶段
- 冒泡阶段
- 事件流种类
- 捕获型事件流: 事件处理函数是在事件的捕获阶段执行
- 冒泡型事件流: 事件处理函数是在事件的冒泡阶段执行
-
attachEvent 和 addEventListener 区别
- 参数个数不同
- 事件类型传值不同
IE标准需要加on前缀W3C标准不加on前缀
- 在绑定多个事件处理函数时,
IE在执行事件处理函数时,顺序不定(根据版本),而W3C按照对垒结构来一次执行事件的处理函数 - 在事件处理函数内
this指向不同- IE:
window - W3C: 返回正在执行事件的处理函数的
dom元素
- IE:
addEvent 方法
- 根据浏览器能力,提前返回事件绑定方法
- 如果浏览器符合
W3C标准,使用addEventListener来绑定事件 - 否则就使用
attachEvent来绑定事件
//提前返回
var addEvent = function() {
// 如果符合W3C标准,使用addEvnetListener绑定事件
if (global.addEventListener) {
return function(elem, type, callback, useCapture) {
elem.addEventListener(type, callback, useCapture || false);
};
} else { // 否则就使用IE标准的 attachEvent绑定事件
return function(elem, type, callback) {
elem.attachEvent('on' + type, callback);
};
}
}();
removeEvent 方法
- 根据浏览器能力,提前返回事件移除方法
- 如果浏览器符合
W3C标准,使用removeEventListener来移除事件处理函数 - 否则就使用
detachEvent来移除事件处理函数
//提前返回
var removeEvent = function() {
if (global.removeEventListener) {
return function(elem, type, callback) {
elem.removeEventListener(type, callback);
};
} else {
return function(elem, type, callback) {
elem.detachEvent('on' + type, callback);
};
}
}();
on 方法
- 功能:给
itcast对象上的所有的dom元素绑定事件 - 实现思路
- 遍历
this上所有dom元素 - 调用
addEvent给当前遍历到的dom元素绑定事件 - 返回
this,实现链式编程
- 遍历
on: function(type, callback, capture) {
return this.each(function() {
addEvent(this, type, callback, capture);
});
},
off 方法
- 功能:移除
itcast对象上所有dom元素的事件处理函数 - 实现思路
- 遍历
this上所有dom元素 - 调用
removeEvent给当前遍历到的dom元素移除相应事件的处理函数 - 返回
this,实现链式编程
- 遍历
off: function(type, callback) {
return this.each(function() {
removeEvent(this, type, callback);
});
}
click 方法
- 功能: 给
itcast对象上的所有的dom元素绑定单击事件处理函数的 - 语法:
itcast对象.click(callback); - 实现思路
- 遍历
this上的所有dom元素 - 调用
addEventListener分别传值即可 return this实现链式编程
- 遍历
click: function(callback, capture) {
return this.each(function() {
addEvent(this, 'click', callback, capture);
});
}
快捷绑定事件方法
itcast.each(['click', 'dblclick', 'keypress', 'keyup', 'keydown', 'mouseover', 'mouseout',
'mouseenter', 'mouseleave', 'mousemove', 'mouseup', 'mousedown'], function(type) {
itcast.fn[type] = function(callback, capture) {
return this.on(type, callback, capture);
};
});满分是10分的话,这篇文章你给几分,您的支持将鼓励我继续创作!
谢谢你读到这里。
订阅 RSS
聊一聊
评论正在加载。也可以通过 邮件 联系我。