美文网首页
jq和原生js事件委托.on()、addEventListene

jq和原生js事件委托.on()、addEventListene

作者: krystal_H | 来源:发表于2019-09-24 21:23 被阅读0次

事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document)。
原理:事件委托是利用事件的冒泡原理来实现的 。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。
————————————————
比较早的jq写的,没有ES6模板字符串,就js拼接字符串。
大概有个类似这样的需求

image.png
  • 点击左边+号右边添加,再点击,取消灰色并移除右边的菜单项;
  • 左边添加后,也可以通过右边的x来删除,同时移除左边菜单块灰色。
    左边就是拿到数据,拼接DOM元素,放进去,这是就用到了事件委托通过子节点元素绑定事件来传递给父元素DOM节点,父元素代子元素执行事件,来统一管理其全部后代子元素
    tips:对应标签绑定事件这样很不推荐,原因如下(参考忘了)
  1. 绑定事件太多,浏览器占用内存变大,严重影响性能;
  2. Ajax出现,局部刷新盛行,每次加载完,都要重新绑定事件;
  3. 部分浏览器移除元素时,绑定的事件没有被及时移除,导致内存泄漏,严重影响性能;
  4. Ajax中重复绑定,导致代码耦合性过大,影响后期维护
// 左侧选择添加菜单的方法
function clickPlus(obj) {
 $(obj).parent().toggleClass('gray')
 var name = $(obj).parent().attr('data-name')
 if ($(obj).parent().hasClass('gray')) {
   var html = ''
   html += '<div class="cont-item" data-name=' + name + '>'
   html += '<span class="name">' + name + '</span>'
   html += '<span class="delete">x</span>'
   html += '</div>'
   $('.content').append(html)
 } else {
   deleteItem(name)
 }
}
<div class="submit" onclick="submit(this)"></div>

.html文件中可以直接传this指向的是当前标签,所以,
刚开始想在span上绑定onclick把name和this都传过去,这样当前知道选择的元素就可以直接remove()掉了,如下

html += '<span class="plus" onclick="clickPlus(this,\''+item.name+'\')">+</span>'

但参数多的话容易出问题,还影响性能等等,就转为事件委托,避免此种情况

// 右边直接点击删除按钮
$('.content').on('click', $('.cont-item'), function (ev) {
  var delName = $(ev.target).parent().attr('data-name')
  var menuArr = $('.right-item .bar')
  $.each(menuArr, function (index, item) {
    if (delName == $(item).attr('data-name')) $(item).toggleClass('gray')
  })
  $(ev.target).parent().remove()
})

remove时如果出错,可加一层判断

if($(ev.target).prop('nodeName')=="SPAN")  ...remove()

假如.on那一行改成

//会自动找.cont-item,不需要加$符号指定,这样也就不用判断nodeName这样更常见
$('.content').on('click', '.cont-item', function (ev) { 

比起bind、delegate使用on更推荐,
$('父元素').on('click', $('子元素'),function(ev){...})

原生js例子:

<ul id = "lists">
    <li>列表1</li>
    <li>列表2</li>
    <li>列表3</li>
    <li>列表4</li>
    <li>列表5</li>
    <li>列表6</li>
 </ul>
var lists = document.getElementById("lists");
lists.addEventListener("click",function(event){
  var target = event.target;
   //防止父元素ul也触发事件
  if(target.nodeName == "LI"){
    target.style.backgroundColor = "red";
  }
})

相关文章

  • jq和原生js事件委托.on()、addEventListene

    事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document)。原理...

  • Day04(jQuery事件,事件绑定,demo 滑动解锁)

    jQuery 事件 原生JS带 on 的事件,去掉 on 就是 jQ 事件 1.单击事件 click(); 2.事...

  • 8-jQuery编写选项卡

    JS原生: JQ:

  • 仿写JQ方法

    原生js仿写jq 仿写jq的click方法 仿写jq的on事件 仿写jq的eq方法 仿写jq的 css方法 仿写j...

  • jQuery 相关

    在jQ元素上调用.click()并不会触发原生js的点击事件,而是已绑定的jQ点击事件 宽高属性获取innerWi...

  • jq事件委托和this指向

    使用情境: 对ajax返回的未来元素进行事件绑定, 需要利用冒泡机制, 进行事件委托.并使用e.target 获取...

  • 事件应用代码备份 和Tab组件

    方方的Tab组件JQ原生JS和JQ一个意思但是麻烦了不少http://js.jirengu.com/sixil/1...

  • 原生 JS 实现事件委托

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

  • js原生之事件委托

    什么是事件委托? 委托是啥意思?就是本来吧中午啊你要自己去买饭,结果这个时候室友问你要不要带饭?你说好啊!于是带饭...

  • js 原生事件委托

    在给dom元素添加异步事件的时候,如果需要给子元素添加事件,有两种办法,1.直接给该子元素添加事件;2.给该子元素...

网友评论

      本文标题:jq和原生js事件委托.on()、addEventListene

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