问题在代码里面,请耐心观看,有劳了,谢谢。
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);
}
}
}
var decorator = function(input, fn) {
var input = document.getElementById(input);
if (typeof input.onclick === 'function') {
var oldClickFn = input.onclick;
input.onclick = function() {
oldClickFn();
fn();
}
} else {
input.onclick = fn;
}
}
//jQuery event封装支持判断元素上是否绑定了事件,此方法只适用于jQuery绑定的事件
var $events = $("#testdiv").data("events");
if( $events && $events["click"] ){
// 绑定
}else{
// 未绑定
}
如果是原生绑定的事件,需要使用插件。
http://stackoverflow.com/ques...
用原生的,确实比较痛苦。不能判断是否已经绑定,但是如果处理函数(对象)未变的话,是可以 remove 的,用 removeEventListener
。
我还是建议你用 jQuery。jQuery 在删除事件的时候不需要提供原处理函数,而且可以删除所有的某个事件,或者部分某个事件处理函数,比如
$dom.on("click", handler1)
.on("click.amark", handler2);
// 删除标记为 amark 的 click 事件处理函数,也就是 handler2
$dom.off("click.amark")
// 删除所有 click 事件处理函数,也就是 handler1 和 handler2
$dom.off("click");
据我所知原生的不好弄,jq的实现其实很简单
jq的事件都是事件委托,所有的事件都被它存了起来,判断某元素是否绑定了某事件,只需要在事件堆栈里面查询一遍就知道了。