Skip to content

[js] 第223天 举例说明你对事件代理的理解 #1563

@haizhilin2013

Description

@haizhilin2013
Collaborator

第223天 举例说明你对事件代理的理解

我也要出题

Activity

niu315

niu315 commented on Nov 25, 2019

@niu315

事件代理,事件冒泡,原理就是将点击子元素的效果加在父元素上,使其冒泡给子元素,让操作更加方便。

NicholasBaiYa

NicholasBaiYa commented on Nov 26, 2019

@NicholasBaiYa

事件代理,事件冒泡,原理就是将点击子元素的效果加在父元素上,使其冒泡给子元素,让操作更加方便。

不应该是从子元素冒泡到父元素吗?

Cleam

Cleam commented on Nov 27, 2019

@Cleam

示例

有一个列表 ul,列表里面的每一项 li 是通过 js 动态生成到 html 中,在列表数据还没有获取到的时候,需要先注册列表项的点击事件,这时候使用事件代理,将列表项 li(children)的点击事件代理给父级列表 ul(parent)

<ul id="J_list"></ul>
const listDom = document.getElementById('J_list');
// 事件代理
listDom.addEventListener('click', e => {
  if (e.target.nodeName.toLowerCase() === 'li') {
    const li = e.target;
    console.log(li.getAttribute('data-id'));
  }
});

// 模拟异步获取数据
const getListData = () => {
  return new Promise((resove, reject) => {
    setTimeout(() => {
      resove([
        {
          id: 0,
          name: 'zhangsan',
          age: 18
        },
        {
          id: 1,
          name: 'lisi',
          age: 19
        },
        {
          id: 2,
          name: 'wangwu',
          age: 17
        }
      ]);
    }, 2000);
  });
};

getListData().then(list => {
  // 生成list
  list.forEach(({ id, name, age }) => {
    let li = document.createElement('li');
    li.setAttribute('data-id', id);
    li.innerText = `${name}: ${age}`;
    listDom.appendChild(li);
  });
});

这里只是举了一个我平常用到的最多的场景,没有经过严格测试,希望对你理解事件代理有帮助。

总结

事件代理就是通过事件冒泡的原理,点击 li 时,会冒泡触发到 ul 的 click 事件,从而通过事件对象 e.target 找到 li。
事件冒泡&事件捕获

xiaoqiangz

xiaoqiangz commented on Aug 18, 2022

@xiaoqiangz

事件代理就是利用事件冒泡,把事件监听放到父元素上,点击子元素后,向上冒泡,父元素捕获到可以通过event.target来获取子元素,只需要对父元素做事件监听,不需要对每个子元素做处理,对性能有很大的提升。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    jsJavaScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @Cleam@haizhilin2013@xiaoqiangz@NicholasBaiYa@niu315

        Issue actions

          [js] 第223天 举例说明你对事件代理的理解 · Issue #1563 · haizlin/fe-interview