问题在代码里面,请耐心观看,有劳了,谢谢。
var div = document.getElementById('div');
logEvent('click' , div , false , false , function(){
console.log('数据测试!');
});
/*
@param HTMLElement ele 绑定事件的元素
@param String eventType 事件类型
@param Boolean isCaptureCatch 是否在捕获阶段触发
@param Boolean isRepeat 是否允许同类型事件重复绑定
@param Function fn 事件绑定的函数
@return undefined
*/
function loginEvent(ele , evenType , isCaptureCatch , isRepeat , fn){
// 一个分支: isRepeat = false 的时候
// 我就需要先判断该事件上是否已经绑定了同类型事件(不允许同一元素上重复绑定同一类型事件)
if (!isRepeat) {
/*
* 判断一个元素上是否已绑定某事件
* 这个 container 函数怎么实现??求大神指教
*/
if (!container(ele , eventType)) {
// 未绑定,所以绑定事件
ele.addEventListener(eventType , fn , isCaptureCatch);
}
}
}
该问题已解决,贴出解决后的代码分享下哈:-----------------------------
/*
* 事件注册
* @param Element ele
* @param String eventType
* @param Function fn
* @param Boolean isRepeat
* @param Boolean isCaptureCatch
* @return undefined
*/
function loginEvent(ele , eventType , fn , isRepeat , isCaptureCatch){
if (ele == undefined || eventType === undefined || fn === undefined) {
throw new Error('传入的参数错误!');
}
if (typeof ele !== 'object') {
throw new TypeError('不是对象!');
}
if (typeof eventType !== 'string') {
throw new TypeError('事件类型错误!');
}
if (typeof fn !== 'function') {
throw new TypeError('fn 不是函数!');
}
if (isCaptureCatch === undefined || typeof isCaptureCatch !== 'boolean') {
isCaptureCatch = false;
}
if (isRepeat === undefined || typeof isRepeat !== 'boolean') {
isRepeat = true;
}
if (ele.eventList === undefined) {
ele.eventList = {};
}
if (isRepeat === false) {
for (var key in ele.eventList)
{
if (key === eventType) {
return '该事件已经绑定过!';
}
}
}
// 添加事件监听
if (ele.addEventListener) {
ele.addEventListener(eventType , fn , isCaptureCatch);
} else if (ele.attachEvent) {
ele.attachEvent('on' + eventType , fn);
} else {
return false;
}
ele.eventList[eventType] = true;
}
据我所知原生的不好弄,jq的实现其实很简单。
jq的事件都是事件委托,所有的事件都被它存了起来,判断某元素是否绑定了某事件,只需要在事件堆栈里面查询一遍就知道了。