事件委托的应用—座位预定

DOM事件流

定义

DOM事件流包括三个阶段

  • 捕获阶段:事件的触发响应会从最外层目标一层层地向内到最低层;
  • 目标阶段:目标阶段就是指事件响应到触发事件的最底层元素上;
  • 冒泡阶段:事件的触发响应会从最底层目标一层层地向外到最外层;

事件触发时会在元素节点间按照特定的顺序传播,这个传播的过程就是DOM事件流

图例

在这里插入图片描述

事件委托

概念

事件委托,就是把一个元素响应事件的函数委托到另一个元素;
一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。

优点

1.可以减少事件的注册,节省内存占用

在每行里面我们有许多座位,我们需要在点击座位的时候来切换预定状态;

<div class="area">
	<div class="row">
        <div class="seat"></div>
        <div class="seat"></div>
        <div class="seat"></div>
        <div class="seat"></div>
        <div class="seat"></div>
        <div class="seat"></div>
        <div class="seat"></div>
        <div class="seat"></div>
	</div>
//div.row*20
<div class="area">

如果给每个座位都绑定一个函数,会增加很多DOM操作,也占用很多内存资源。
如果用事件委托把座位的点击事件绑定到一个合适的外层元素上(area),然后在执行事件的时候再去匹配判断目标元素(使用e.target)。
所以事件委托可以提高内存和性能。

2.适合动态元素的绑定事件

新添加的元素也会有监听函数,也可以有事件触发机制。

应用示例–座位预定

预览

在这里插入图片描述

布局

<h1>电影座位预定</h1>
    <ul class="seatExample">
        <li>
            <div class="seat example"></div>
            <small>可选</small>
        </li>
        <li>
            <div class="seat selected example"></div>
            <small>已选</small>
        </li>
        <li>
            <div class="seat occupied example"></div>
            <small>不可选</small>
        </li>
    </ul>

    <div class="area">
        <div class="screen"></div>
    </div>

座位预定

座位的动态生成:

const oarea = document.querySelector(".area");
const oseat = document.querySelectorAll("row .seat:not(.occupied)");

window.onload = function createState() {
    for(let i = 1;i<=6;i++){
        let row = document.createElement('div')
        oarea.appendChild(row)
        row.setAttribute('class','row')
        for(let j = 1;j<=8;j++) {
            let newseat = document.createElement('div');
            row.appendChild(newseat);
            newseat.setAttribute('class', 'seat');
            // newseat.addEventListener('click',function(e){
            //     if(newseat.classList.contains('seat')&&
            //     !newseat.classList.contains('occupied'))
            //     {
            //         newseat.classList.toggle('selected');
            //     }
		}
	}
}

在添加上的元素中通过 setAttributet 方法添加样式,可以根据自己的需求自己去写相应的css代码。

注释部分是在每个座位元素创立时绑定事件。

使用事件委托,给最外面的 .area 添加监听器,那么点击座位时的时候,都会冒泡到外层的 .areo 上(.seat>.row>.area), e.target 返回目标节点。

oarea.addEventListener("click",function(e){
    if(e.target.classList.contains('seat')&&
    !e.target.classList.contains('occupied'))
    {
        e.target.classList.toggle('selected');
    }
})

结尾

以上就是事件委托在电影座位预定中的使用啦。之前阅读介绍事件委托的文章时大都是用抽象的例子来解释,所以自己补充了在具体的情况下的应用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值