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>

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

时间: 2024-10-19 13:18:25

JavaScript事件代理,减少开销提高效率的相关文章

JavaScript事件代理入门

事件代理(Event Delegation),又称之为事件委托.是 JavaScript 中常用绑定事件的常用技巧. 顾名思义,"事件代理"即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务. 为什么要这样做呢? 众所周知,DOM操作是十分消耗性能的.所以重复的事件绑定简直是性能杀手.而事件代理的核心思想,就是通过尽量少的绑定,去监听尽量多的事件. 下面将会用 Zepto 为大家演示怎么实现事件代理. 啊?Zepto是什么? Zepto is a minimalist J

JavaScript 事件代理

转自:http://www.cnblogs.com/silence516/archive/2009/09/03/delegateEvent.html 如果你想给网页添加点JavaScript的交互性,也许你已经听过JavaScript的事件代理(event delegation),并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么费解的设计模式之一.事实上,如果你已经知道怎么添加JavaScript的事件处理器(event handler),实现事件代理也是件轻而易举的事情.

JavaScript事件代理和委托

在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么特殊的用法呢?这篇文章就主要介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口. JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的

JavaScript事件代理和委托(Delegation)

JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数.这主要得益于浏览器的事件冒泡机制. 假设有一个 UL 的父节点,包含了很多个 Li 的子节点: 1 <ul id="parent-list"> 2 <li id="post-1">Item 1</li> 3

JavaScript事件代理和事件委托

一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子,就是取快递来解释这个现象,我仔细揣摩了一下,这个例子还真是恰当,我就不去想别的例子来解释了,借花献佛,我摘过来,大家认真领会一下事件委托到底是一个什么原理: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台

javascript事件代理(delegate)原理解析

什么是事件代理?首先得知道什么是事件,并且弄清楚事件流,才能真正明白事件代理原理. 一.什么是事件? javascript与HTML之间交互就是通过事件实现的,事件就是文档或浏览器窗口中发生的一些特定的交互瞬间.如onload.onclick.onmouseup.onmousedown... . 二.事件流 DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流. 因为历

javascript事件代理(委托)

之前有接触过事件代理,但是印象并不深刻.这次记下来加强印象. 用个大家比较常见的代码举例子: html dom结构: <ul id="ul1"> <li>001</li> <li>002</li> <li>003</li> </ul> <script> var oUl = document.getElementById('ul1'); var aLi = oUl.getEleme

JavaScript 事件代理绑定

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <style> 9 .out li{line-height: 25px;width: 200px; padding: 5px; border:

关于JavaScript中的事件代理

今天面试某家公司Web前端开发岗位,前面的问题回答的都还算凑活,并且又问了一下昨天面试时做的一道数组去重问题的解题思路(关于数组去重问题,可以观赏我前几天写的:http://www.cnblogs.com/craftsman-gao/p/4766223.html.幸好前几天专门看过这个问题,答题时才能轻松应对啊),因为这些以前都有过研究,所以回答起来并没有太大困难.然而,最后面试官又出了一道代码题让我涨姿势了.题目本身很简单:一个ul中有一千个li,如何给这一千个li绑定一个鼠标点击事件,当鼠标