美文网首页
[] 嵌套标签过多时,实现事件委托

[] 嵌套标签过多时,实现事件委托

作者: Bboy_2016 | 来源:发表于2018-09-10 20:17 被阅读36次

1,问题出现场景:
有得时候我们要所点击元素的父级,例如这种情况,
ul
li
span
...
我们点击span(多数会点击到),其实是想对 li 进行操作,但是由于是事件委托,不得不把事件放到 ul 上(可能是要少写代码)。所以便有如下代码。
上面一层是我用来测试的html
下面是 原生 js 实现,其实还可以参考下 jquery 的实现方式。类似于这种,

$('ul').on('click', 'li', function (e) {}) // 这样绑定的话 e.currentTarget 就是 li

但是我没有jq的环境,所以,No.

代码源于网络,侵删

大致 html 如下:
  const list = [1,2,3,4,5]
  render: function (createElement) {
    return createElement(
      'ul', {
        attrs: {
          id: 'list',
        },
        style: {
          'fontSize': '24px'
        },
        'on': {
          click: this.handler
        }
      }, [
        list.map((item) => {
          return createElement('li', {
          }, [createElement('span', item)])
        })
      ]
    )
  }
    function eventDelegate (parentSelector, targetSelector, events, foo) {
      // 触发执行的函数
      function triFunction (e) {
        // 兼容性处理
        var event = e || window.event;

        // 获取到目标阶段指向的元素
        var target = event.target || event.srcElement;

        // 获取到代理事件的函数
        var currentTarget = event.currentTarget;

        // 处理 matches 的兼容性
        if (!Element.prototype.matches) {
          Element.prototype.matches =
            Element.prototype.matchesSelector ||
            Element.prototype.mozMatchesSelector ||
            Element.prototype.msMatchesSelector ||
            Element.prototype.oMatchesSelector ||
            Element.prototype.webkitMatchesSelector ||
            function (s) {
              var matches = (this.document || this.ownerDocument).querySelectorAll(s),
                i = matches.length;
              while (--i >= 0 && matches.item(i) !== this) {}
              return i > -1;            
            };
        }

        // 遍历外层并且匹配
        while (target !== currentTarget) {
          // 判断是否匹配到我们所需要的元素上
          if (target.matches(targetSelector)) {
            var sTarget = target;
            // 执行绑定的函数,注意 this
            foo.call(sTarget, Array.prototype.slice.call(arguments))
          }

          target = target.parentNode;
        }
      }

      // 如果有多个事件的话需要全部一一绑定事件
      events.split('.').forEach(function (evt) {
        // 多个父层元素的话也需要一一绑定
        Array.prototype.slice.call(document.querySelectorAll(parentSelector)).forEach(function ($p) {
          $p.addEventListener(evt, triFunction)
        })
      })
    }
    eventDelegate('#list', 'li', 'click', function () { console.log(this) })

结果如下:


event delegation.png

相关文章

  • [] 嵌套标签过多时,实现事件委托

    1,问题出现场景:有得时候我们要所点击元素的父级,例如这种情况,ullispan...我们点击span(多数会点击...

  • Javascript事件

    2016/05/02Javascript与HTML的交互主要通过事件来实现。 事件流 HTML标签是嵌套的,我们点...

  • 常用的HTML标签

    1. iframe标签 功能:嵌套页面 1.1 a标签和iframe标签一起使用实现嵌套页面间的切换 2. a标签...

  • unity 委托事件

    定义委托及事件 实现事件监听+=(事件取消监听为-=)

  • 11-11

    1:事件委托又叫事件代理: 2:节点:节元素标签、文本元素标签、分组元素标签 3:目标元素 兼容处理 : 4:im...

  • 2018-01-05 关于react 冒泡事件

    在前端的标签使用中,总会有标签嵌套的地方,这时候标签绑定的事件就会冲突,原因就是冒泡事件造成的。 什么是冒泡事件?...

  • 封装一个通用的事件监听函数

    封装一个通用的事件监听函数,可实现普通的事件监听,也可实现事件委托(事件代理)

  • 事件委托

    focus事件如何实现事件委托?事件委托是利用事件冒泡来做,但是父元素没有focus事件,这咋监听啊?一脸懵逼。。...

  • JavaScript的事件代理和事件委托

    JavaScript中的事件委托是很重要的一个东西,事件委托依靠的就是事件冒泡和捕获的机制。 事件冒泡怎么实现,先...

  • 原生 JS 实现事件委托

    什么是事件委托 事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事...

网友评论

      本文标题:[] 嵌套标签过多时,实现事件委托

      本文链接:https://www.haomeiwen.com/subject/qbregftx.html