利用懒性模式实现事件绑定,顺便实现阻止事件冒泡

利用懒性模式实现事件绑定, 可以减少每次都去判断环境是否为IE等, 提高性能。

function on(dom, type, fn) {
        var d = document;
	if(d.addEventListener) {
		on = function(dom, type, fn) {
			dom.addEventListener(type, fn, false);
		}
	} else if(d.attachEvent) {
		on = function(dom, type, fn) {
			dom.attachEvent('on' + type, fn);
		}
	} else {
		on = function(dom, type, fn) {
			dom['on' + type] = fn;
		}
	}
	return on(dom, type, fn); //懒性模式
}    

  

我们还可以设置一个事件点击次数状态tm, 如果tm为true, 则事件只允许单次点击, 否则则可以多次触发。

在此之前我需要了解一下事件解绑:
首先通过 dom 的 onclick 类似属性设置的事件,对于类似绑定的事件都可以用dom.onclick = null;来解绑事件。
其次通过 addEventListener绑定的事件可以使用 removeEventListener来解绑,这里要注意removeEventListener
接受的参数和addEventListener是一样的,ps:

<div id = "click"> CLICK </div>

var click = document.getElementById('click');
click.addEventListener('click', test);
function test(event) {
	console.log(1);
}
click.removeEventListener('click', test, true);

这里发现事件并没有取消绑定, 就是因为原来参数和绑定时候传入的不一致,我们改成false之后发现事件取消了。
最后一种,就是detachEvent解绑attachEvent事件。


接下来就可以利用传入的tm参数做事情了。

function eventOn(dom, type, fn, tm) {
        var d = document;
	if(d.addEventListener) {
		on = function(dom, type, fn, tm) {
			var newfn = fn;
			if(tm) {
				newfn = function() {
					dom.removeEventListener(type, newfn, false);
					fn();
				}
			}
			dom.addEventListener(type, newfn, false);
		}
	} else if(d.attachEvent) {
		on = function(dom, type, fn, tm) {
			var newfn = fn;
			if(tm) {
				newfn = function() {
					dom.detachEvent('on' + type, newfn);
					fn();
				}
			}
			dom.attachEvent('on' + type, newfn);
		}
	} else {
		on = function(dom, type, fn, tm) {
			var newfn = fn;
			if(tm) {
				newfn = function() {
					dom['on' + type] = null;
					fn();
				}
			}
			dom['on' + type] = newfn;
		}
	}

	return on(dom, type, fn, tm); //懒性模式
}

//测试
eventOn(document.getElementById("room"), 'click', function() {
	alert('1');
}, true); //一次绑定

eventOn(document.getElementById("room"), 'click', function() {
	alert('1');
}); //多次绑定

甚至我们还可以为事件增加事件点击后阻止事件传播。

//阻止事件传播我们可以用

if(typeof e.preventDefault === "function") {
	e.preventDefault();
	e.stopPropagation();
} else {
	e.returnValue = false;
	e.cancelBubble = true;
}

所以结果为:

function eventOn(dom, type, fn, tm) {
        var d = document;
	function pd() {
		var e = this;
		if(typeof e.preventDefault === "function") {
			e.preventDefault();
			e.stopPropagation();
		} else {
			e.returnValue = false;
			e.cancelBubble = true;
		}
	}
	if(d.addEventListener) {
		on = function(dom, type, fn, tm) {
			var newfn = fn;
			if(tm) {
				newfn = function(e) {
					dom.removeEventListener(type, newfn, false);
					fn();
					pd.call(e);
				}
			} else {
				newfn = function(e) {
					fn();
					pd.call(e);
				}
			}
			dom.addEventListener(type, newfn, false);
		}
	} else if(d.attachEvent) {
		on = function(dom, type, fn, tm) {
			var newfn = fn;
			if(tm) {
				newfn = function(e) {
					dom.detachEvent('on' + type, newfn);
					fn();
					pd.call(e);
				}
			} else {
				newfn = function(e) {
					fn();
					pd.call(e);
				}
			}
			dom.attachEvent('on' + type, newfn);
		}
	} else {
		on = function(dom, type, fn, tm) {
			var newfn = fn;
			if(tm) {
				newfn = function(e) {
					dom['on' + type] = null;
					fn();
					pd.call(e);
				}
			} else {
				newfn = function(e) {
					fn();
					pd.call(e);
				}
			}
			dom['on' + type] = newfn;
		}
	}
	return on(dom, type, fn, tm); //懒性模式
}

//测试
eventOn(document.getElementById("room"), 'click', function() {
	alert('1');
}, true); //一次绑定

eventOn(document.getElementById("room"), 'click', function() {
	alert('1');
}); //多次绑定

这样就实现了事件绑定和阻止事件冒泡。

posted @ 2017-02-07 10:52  洛河  阅读(153)  评论(0编辑  收藏  举报