以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
117. 事件委托

实现代码如下:

function onClick(root, predicate, handler) {
  root.addEventListener('click', function(event) {
    let el = event.target;
    while (el !== root) {
      if (predicate(el)) {
        handler.call(el, event);
      }
      if (event.stopPropagation) {
        event.stopPropagation();
      }
      if (event.stopImmediatePropagation) {
        event.stopImmediatePropagation();
      }
      el = el.parentNode;
    }
  });
}

思路:

  1. 给root元素绑定click事件,传入事件处理函数。
  2. 在事件处理函数中,利用event.target获取最先触发事件的元素,然后从这个元素开始逐层向上找祖先元素,依次判断这些元素是否符合predicate。
  3. 如果当前元素符合predicate,就调用handler处理事件,注意使用call方法将this绑定为当前元素。
  4. 在处理完当前元素之后,需要判断是否需要停止事件传播。如果stopPropagation方法存在,则调用此方法。如果stopImmediatePropagation方法存在,则调用此方法并立即停止传播。
  5. 最后处理完当前元素后,需要将元素向上移一层,继续检查其父元素是否符合条件,直到检查到root为止。