码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript事件代理,减少开销提高效率

时间:2015-06-30 10:55:43      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:javascript事件代理   delegate   javascript on   javascript事件委托   javascript   

JavaScript事件代理(事件委托),即把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。

众所周知,DOM操作是十分消耗性能的。所以重复的事件绑定简直是性能杀手。而事件代理的核心思想,就是通过尽量少的绑

定,去监听尽量多的事件。

事件代理的核心思想:事件冒泡

.on( events [, selector ] [, data ], handler )

.delegate( selector, eventType, handler )

从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于统一取代以前的bind()、 delegate()、 live()等事件函数。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>事件代理</title>
	<script type="text/javascript" src="http://tztest5.ptmind.cn/js/jquery-1.8.0.min.js?v=5/26"></script>
</head>
<body>
	<ul class="list">
		<li class="list_items">000</li>
	    <li class="list_items"><a href="javascript:void(0);">111</a></li>
	    <li class="list_items"><i>222</i></li>
	    <li>333</li>
	</ul>
</body>
<script type="text/javascript">
	/* 
	 * <方式一>
	 * 每一个“.list_items”元素都被绑定了click事件,绑定的对象是“li.list_items”
	 * 这样的做法,当遇到数量超长的列表(ul)和表格(table)时性能开销非常大。
 	 */
	$('.list_items').on('click', function (e) {
	    console.log(e.target.tagName);	//"LI" or "A" or "I"
	    console.log(this);	//LI
	    console.log($(this).text());
	    console.log(this.tagName);//LI
	});

	// 原生JavaScript代码<等价于方式一>:
	[].forEach.call(document.querySelectorAll('.list_items'), function (elem) {
		elem.addEventListener('click', function (e) {
		    console.log(e.target.tagName);
		    console.log(this.tagName);
		}, false);
	});

	/* 
	 * <方式二>
	 * 只有“.list”被绑定了click事件,绑定对象指向“ul.list”
	 * 开销大幅减少
	 */
	$('.list').on('click', '.list_items', function (e) {
	    console.log(e.target.tagName);	//"LI" or "A" or "I"
	    console.log(this);	//LI
	    console.log($(this).text());
	    console.log(this.tagName);//LI
	});

	//原生JavaScript代码<等价于方式二>:
	var listElem = document.querySelector('.list');
	listElem.addEventListener('click', function (e) {
	    var delegateTarget = this;
	    var fireTarget = e.target;
	    var eventTarget;
	 
	    if (fireTarget.className !== 'list_items') {
	        function findParent(elem) {
	            if (elem === delegateTarget) {
	                return null;
	            }
	            var parent = elem.parentNode;
	            if (parent.className === 'list') {
	                return null;
	            }
	            if (parent.className === 'list_items') {
	                return parent;
	            }
	            findParent(parent);
	        }
	        eventTarget = findParent(fireTarget);
	    } else {
	        eventTarget = fireTarget;
	    }
	    if (!eventTarget) return false;
	    console.log('fireTarget: ' + fireTarget.tagName);
	    console.log('eventTarget: ' + eventTarget.tagName);
	}, false);

	/* 
	 * <方式三>
	 * 带数据多事件
	 */
	var data = {name : 'ligang'};
	$('.list').on('mouseenter mouseleave', ".list_items", data, function (e) {
	    var options = e.data;
	    if(e.type === "mouseenter"){
	    	$(this).html("你好," + options.name);
	    }else if(e.type === "mouseleave"){
	    	$(this).html("再见," + options.name);
	    }
	});
</script>
</html>

版权声明:本文为博主原创文章,未经博主允许不得转载。

JavaScript事件代理,减少开销提高效率

标签:javascript事件代理   delegate   javascript on   javascript事件委托   javascript   

原文地址:http://blog.csdn.net/ligang2585116/article/details/46685573

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!