js事件冒泡和事件委托

事件冒泡是指当一个元素上的事件被触发时,事件会从最内层的目标元素开始,逐级向上传播到父级元素,直到到达最顶层的祖先元素(通常是 document 对象)。这是一种默认的事件传播方式。

示例

html复制代码<div id="parent">
    <button id="child">Click me</button>
</div>
javascript复制代码const parent = document.getElementById('parent');
const child = document.getElementById('child');
​
parent.addEventListener('click', () => {
    console.log('Parent clicked');
});
​
child.addEventListener('click', () => {
    console.log('Child clicked');
});

执行结果

  1. 点击 child 按钮时,会先输出 "Child clicked",然后输出 "Parent clicked"。这就是事件冒泡的效果。

事件委托(Event Delegation)

事件委托是利用事件冒泡的特性,将一个事件处理程序添加到父元素上,而不是给每个子元素分别添加事件处理程序。当事件发生时,事件处理程序会检查事件的目标元素,并对特定的子元素进行处理。事件委托可以有效减少内存消耗,提高性能,尤其是在处理大量动态子元素时。

示例

html复制代码<ul id="list">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>
javascript复制代码const list = document.getElementById('list');
​
list.addEventListener('click', (event) => {
    if (event.target.tagName === 'LI') {
        console.log(`Clicked on ${event.target.textContent}`);
    }
});

执行结果

  1. 无论点击 list 内的哪个 li 元素,都会触发 list 上的点击事件处理程序,并且只对点击的 li 元素进行处理。

主要区别

  1. 定义

    • 事件冒泡:是事件传播的一种方式,事件从目标元素向上传播到祖先元素。

    • 事件委托:是一种编程技巧,通过事件冒泡机制,将事件处理程序添加到父元素上,利用事件目标来处理特定的子元素。

  2. 目的

    • 事件冒泡:描述事件传播的机制。

    • 事件委托:优化事件处理,减少内存消耗,尤其适用于处理大量动态生成的子元素。

  3. 用法

    • 事件冒泡:是浏览器事件模型的一部分,自动发生。

    • 事件委托:是开发者通过编程实现的技巧,利用事件冒泡机制来简化事件处理。

事件委托的优点

  • 性能优化:减少需要绑定的事件处理程序的数量,降低内存消耗。

  • 动态元素处理:方便处理动态添加或删除的子元素的事件。

  • 简化代码:减少重复代码,使代码更加简洁和易于维护。

事件委托的缺点

  • 限制:不适用于不支持冒泡的事件(如 blurfocus 事件)。

  • 复杂度:需要手动检查事件目标,增加了代码的复杂度。

总结

  • 事件冒泡是事件传播机制的一部分,描述了事件从目标元素向上传播的过程。

  • 事件委托是一种编程技巧,利用事件冒泡机制,通过在父元素上绑定事件处理程序来处理子元素的事件。

用链表实现两数相加

在链表中实现两数相加的一个经典问题就是在两个链表中,每个节点代表一个数字的位,两个链表代表两个非负整数。数字以逆序存储,每个节点包含一个数字。将两个数相加并返回一个新的链表表示结果。

javascript复制代码class ListNode {
    constructor(val = 0, next = null) {
        this.val = val;
        this.next = next;
    }
}
​
function addTwoNumbers(l1, l2) {
    let dummy = new ListNode();
    let current = dummy;
    let carry = 0;
​
    while (l1 !== null || l2 !== null) {
        let sum = carry;
​
        if (l1 !== null) {
            sum += l1.val;
            l1 = l1.next;
        }
​
        if (l2 !== null) {
            sum += l2.val;
            l2 = l2.next;
        }
​
        carry = Math.floor(sum / 10);
        current.next = new ListNode(sum % 10);
        current = current.next;
    }
​
    if (carry > 0) {
        current.next = new ListNode(carry);
    }
​
    return dummy.next;
}

项目中的难点问题

  1. 状态管理:在使用 Redux 时,如何高效地管理复杂的状态树,并确保组件间状态的一致性和数据流的合理性。

  2. 实时数据更新:实现 WebSocket 来进行实时数据传输,确保数据能够及时、准确地反映在前端页面上。

  3. 组件复用:设计可复用的组件,以减少重复代码,提高开发效率和维护性。

  4. 性能优化:对 React/Vue 组件进行性能优化,如避免不必要的重新渲染、懒加载等。

  5. 跨组件通信:在 Vue 和 React 中,如何优雅地进行跨组件通信,比如在深层嵌套的组件中传递数据。

事件冒泡是指当一个元素上的事件被触发时,该事件会从最内层的元素开始向父级元素逐级触发,直到触发到最外层的元素为止。事件冒泡可以通过使用 `event.stopPropagation()` 方法来停止继续向上冒泡。 事件委托则是利用事件冒泡的特性,将事件处理程序绑定在父级元素上,通过判断事件源来执行相应的操作。这种方式可以减少事件处理程序的数量,优化性能,特别适用于动态添加或删除子元素的情况。 举个例子来说,假设有一个父级元素 ul,里面包含多个子元素 li,我们希望点击每个 li 元素时能执行相应的操作。传统的方式是给每个 li 元素都绑定点击事件,但是如果 li 元素很多的话会导致事件处理程序过多。而使用事件委托的方式,我们只需要给 ul 元素绑定一个点击事件,并通过判断事件源是哪个 li 元素来执行对应的操作。 ```javascript // 传统方式 const lis = document.querySelectorAll('li'); lis.forEach(li => { li.addEventListener('click', function() { // 执行操作 }); }); // 事件委托 const ul = document.querySelector('ul'); ul.addEventListener('click', function(event) { const target = event.target; if (target.tagName === 'LI') { // 执行操作 } }); ``` 通过事件委托,我们只需要绑定一个事件处理程序,即使动态添加或删除了 li 元素,也不需要重新绑定事件处理程序,从而提高了性能和代码的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光影少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值