首页 > 编程语言 >JavaScript事件代理,减少开销提高效率

JavaScript事件代理,减少开销提高效率

时间:2023-03-13 11:33:00浏览次数:42  
标签:开销 console log items JavaScript list 提高效率 事件 tagName


JavaScript事件代理(事件委托),即把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。

众所周知,DOM操作是十分消耗性能的。所以重复的事件绑定简直是性能杀手。而事件代理的核心思想,就是通过尽量少的绑定,去监听尽量多的事件。

事件代理的核心思想:事件冒泡


.on( events [, selector ] [, data ], handler )


.delegate( selector, eventType, handler )

从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于统一取代以前的bind()、 delegate()、 live()等事件函数。

示例:


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件代理</title>
<script type="text/javascript" src="http://tztest5.ptmind.cn/js/jquery-1.8.0.min.js?v=5/26"></script>
</head>
<body>
<ul class="list">
<li class="list_items">000</li>
<li class="list_items"><a href="javascript:void(0);">111</a></li>
<li class="list_items"><i>222</i></li>
<li>333</li>
</ul>
</body>
<script type="text/javascript">
/*
* <方式一>
* 每一个“.list_items”元素都被绑定了click事件,绑定的对象是“li.list_items”
* 这样的做法,当遇到数量超长的列表(ul)和表格(table)时性能开销非常大。
*/
$('.list_items').on('click', function (e) {
console.log(e.target.tagName); //"LI" or "A" or "I"
console.log(this); //LI
console.log($(this).text());
console.log(this.tagName);//LI
});

// 原生JavaScript代码<等价于方式一>:
[].forEach.call(document.querySelectorAll('.list_items'), function (elem) {
elem.addEventListener('click', function (e) {
console.log(e.target.tagName);
console.log(this.tagName);
}, false);
});

/*
* <方式二>
* 只有“.list”被绑定了click事件,绑定对象指向“ul.list”
* 开销大幅减少
*/
$('.list').on('click', '.list_items', function (e) {
console.log(e.target.tagName); //"LI" or "A" or "I"
console.log(this); //LI
console.log($(this).text());
console.log(this.tagName);//LI
});

//原生JavaScript代码<等价于方式二>:
var listElem = document.querySelector('.list');
listElem.addEventListener('click', function (e) {
var delegateTarget = this;
var fireTarget = e.target;
var eventTarget;

if (fireTarget.className !== 'list_items') {
function findParent(elem) {
if (elem === delegateTarget) {
return null;
}
var parent = elem.parentNode;
if (parent.className === 'list') {
return null;
}
if (parent.className === 'list_items') {
return parent;
}
findParent(parent);
}
eventTarget = findParent(fireTarget);
} else {
eventTarget = fireTarget;
}
if (!eventTarget) return false;
console.log('fireTarget: ' + fireTarget.tagName);
console.log('eventTarget: ' + eventTarget.tagName);
}, false);

/*
* <方式三>
* 带数据多事件
*/
var data = {name : 'ligang'};
$('.list').on('mouseenter mouseleave', ".list_items", data, function (e) {
var options = e.data;
if(e.type === "mouseenter"){
$(this).html("你好," + options.name);
}else if(e.type === "mouseleave"){
$(this).html("再见," + options.name);
}
});
</script>
</html>


标签:开销,console,log,items,JavaScript,list,提高效率,事件,tagName
From: https://blog.51cto.com/u_15998238/6117402

相关文章

  • JavaScript回调函数
    JavaScriptAPI里这样解释:Acallbackisafunctionthatispassedasanargumenttoanotherfunctionandisexecutedafteritsparentfunctionhascompleted.(回调......
  • JavaScript异步编程的深入理解,使用回调函数实现异步编程
    异步编程是指在程序运行时,任务不会按照函数调用的顺序依次执行,而是可以同时执行多个任务。JavaScript异步编程有很多种方式,例如使用回调函数、Promise、async/await等。下面......
  • [JS JavaScript] 使用CryptoJS库对给定的加密字符串进行解密
    本代码可以使用在Web中,或者其他可以出入密码的场景在需要解密的信息不大的情况下,可以将加密后的信息放入到JS中,在输入密码后,对加密后的信息进行解密在vue中,可以很方便的......
  • Android与H5(JavaScript)之间的简单交互
    Android响应Js的动作 假设网页端要调用Android原生的方法:showToast();1.做一个盆子接收消息(创建一个工具类,写一个方法(*带注解))publicclassJavaScriptMethod{......
  • 【JavaScript】41_包装类与垃圾回收机制
    10、包装类在JS中,除了直接创建原始值外,也可以创建原始值的对象通过newString()可以创建String类型的对象通过newNumber()可以创建Number类型的对象通过newBoolean()......
  • JavaScript表单
          ......
  • 设计模式-javascript实现【外观模式】
    定义:外观模式又叫门面模式,外观模式为一个系统中的子系统提供一个统一的高层接口,从而方便使用子系统。1.用类实现外观模式classCpu{install(){console.log('......
  • vue (或者 javascript ) 打印彩色日志
    typeAny=any/***创建console所需的style样式*@parambgColor*@paramfontColor*/constcreateStyle=function(bgColor:string,fontColor='#fff......
  • javascript | 刷新页面的方式
    方式序号方法1history.go()2location.reload()3location=location4location.assign(location.href)5location.replace(location.href)6l......
  • JavaScript 对象管家 Proxy
    JavaScript在ES6中,引入了一个新的对象类型​​Proxy​​​,它可以用来代理另一个对象,并可以在代理过程中拦截、覆盖和定制对象的操作。​​Proxy​​对象封装另一个对象......