javascript addEventListener中的e.target和this的区别

本文介绍了一个使用HTML和JavaScript创建的简单网页示例,重点展示了如何通过JavaScript为页面元素注册click事件并获取触发事件的目标元素。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"/>
<title>Title</title>
<script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
<style type="text/css">

</style>
</head>

<body>

    <div id="box">
        <ul>
            <li>我是第1个li</li>
            <li>我是第2个li</li>
            <li>我是第3个li</li>
            <li>我是第4个li</li>
            <li>我是第5个li</li>
            <li>我是第6个li</li>
        </ul>
    </div>

   <script>

    var oDiv = document.getElementById('box');      //返回box元素

    //注册click事件
    oDiv.addEventListener('click',function(e){
        //event.target表示发生点击事件的元素
        //this始终指向绑定事件的元素也就是div 和event.currentTarget相等

        console.log(this);
        console.log(e.currentTarget);
        console.log(e.target);

        var l = e.target;
        if(l){
            alert(l.innerHTML);
        }
    });

   </script>

</body>
</html>

这里写图片描述

class SidebarAccordion { constructor(selector = '#sidebar') { this.sidebar = document.querySelector(selector); this.collapseSelector = '.collapse'; this.initCollapseEvents(); } initCollapseEvents() { this.sidebar?.querySelectorAll(this.collapseSelector).forEach(collapse => { collapse.addEventListener('show.bs.collapse', (e) => { if (!this.isCollapseOpen(e.target)) { this.closeOthers(e.target); const icon = e.target.previousElementSibling.querySelector('.collapse-icon'); icon.classList.add('rotate-90'); } }); collapse.addEventListener('hide.bs.collapse', (e) => { const icon = e.target.previousElementSibling.querySelector('.collapse-icon'); icon.classList.remove('rotate-90'); }); }); } closeOthers(currentCollapse) { const allCollapses = [...this.sidebar.querySelectorAll(this.collapseSelector)]; allCollapses.forEach(collapse => { if (collapse !== currentCollapse && this.isCollapseOpen(collapse)) { bootstrap.Collapse.getInstance(collapse)?.hide(); } }); } isCollapseOpen(collapseElement) { return collapseElement.classList.contains('show'); } } document.addEventListener('DOMContentLoaded', () => { new SidebarAccordion(); }); 上方是我的側邊欄設計代碼,其中js部分可以看到,我有個if判斷,判斷是否已經展開,如果已經展開則跳過這個步驟,然而實際情況是,當我點擊點擊已經展開的節點後,先觸發collapse.addEventListener('hide.bs.collapse', (e),然後會再次觸發collapse.addEventListener('show.bs.collapse', (e) 導致了點擊已展開的節點無法關閉的現象 並且頁面初始化後,會觸發兩次collapse.addEventListener('show.bs.collapse', (e),並且每次if (!this.isCollapseOpen(e.target))返回的結果都是false,因為在判斷前節點已經被關閉了 請給出解決方案,要求代碼簡潔高效,代碼極簡化風格
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值