事件委托

文章开始之前首先介绍一位大神的github地址:

https://github.com/EleanorMao/FlexoCalendar.js

这是一个日期的插件,很好用,感谢大神的分享!


本次讲到事件委托,是因为今天要写一个选择以周为时间段的功能,如下图所示,然后我要点击第几周然后获取后面的时间段。开始是可以的,但是当我切换月份后就获取不到了,因为这位大神写的时间是动态生成的,新添加的元素不会绑定事件,所以需要每次添加新元素时同时添加绑定事件。这显然不科学。于是我就想到了事件委托可以派上用场了,因为事件委托可以为动态生成的元素赋予点击事件


首先看看我在网上找到的别人总计的js中事件传播过程:

事件的处理流成分为三阶段:

    一、事件捕获阶段:当某个元素触发某个事件时,首先会触发根元素document,然后事件将沿着dom树向下传播给目标节点的每一个祖先节点,直到目标节点。

    二、目标阶段:到达目标元素之后,执行目标元素的事件处理函数

    三、事件冒泡阶段:从目标元素开时,事件将沿着DOM树向上传播,直到根节点。







事件委托就是利用事件冒泡原理,把处理任务委托给父元素或者祖先元素(通常用父元素),我们通过目标对象来判断事件源,并执行事件处理。

结合代码分析:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>FlexoCalendar</title>
	<link rel="stylesheet" href="FlexoCalendar.css">
	<script src="jq.js"></script>
	<script src="FlexoCalendar.js"></script>
</head>
<body style="background:#f5f5f5;">
	<!-- <div class="calendar-wrapper">
		<div id="calendar"></div>
	</div> -->
	<div class="calendar-wrapper">
		<div id="calendar-weekly"></div>
	</div>
	<!-- <div class="calendar-wrapper">
		<div id="calendar-monthly"></div>
	</div> -->
	
	
	<script>
		$("#calendar").flexoCalendar({setYear:2017,setMonth:1, selectDate: 'each-each-each'});
		$("#calendar-weekly").flexoCalendar({type:'weekly',today:false});
		$("#calendar-monthly").flexoCalendar({
			type: 'monthly',
			onselect: function(date){
				console.log(date)
			}
		});
		
		var calendars =  document.getElementById("calendar-weekly");
		calendars.addEventListener("click",function(e){
			var e = e||window.event;
			//e.srcElement 是IE特有的
			//e.target 是dom标准
			var target = e.target || e.srcElement;
			//alert(target.innerHTML);
			if(target.className == "process"){
				console.log(target.innerHTML)
			}else if(target.className == "week"){
				console.log(target.nextSibling.innerHTML)
			}
		})

	</script>
</body>
</html>

此代码是在上面github里面下载后再自己加上事件委托的。可以看到,我们不是给生成的span 或者 tr   td 绑定点击事件,而是给他们的祖先div绑定点击事件,然后通过e.target判断当前点击的是哪个节点,输出其内或者其下一个元素内的内容(nextSibling 属性可返回某个元素之后紧跟的节点(处于同一树层级中)。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值