jquery中事件委派代码分析以及jQuery中delegate和on的用法与区别详细解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:
jquery中事件委派我们会使用到delegate与live方法了,下面我就以delegate与live方法为例子给各位分析一下jquery 事件委派的例子吧,希望例子能帮助到各位朋友。

什么是jquery中的事件委派?

在jquery中有一个很重要的概念——事件委派,相信很多搞前端开发的人都听说过,零度逍遥本来对此不是十分理解,但经过一个高人的指点后,才发现这个功能还是蛮强大的,今天就给大家分享一下。

事件委派的定义就是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。

说的有点抽象,按照惯例,还是举个例子说明:

 代码如下 复制代码

<ul class="list">
    <li>11111<li>
    <li>222222<li>
    <li>3333<li>
    <li>4444<li>
</ul>

这是一个ul,里面包含4个li,如果想要给li加上点击事件,弹出一些内容,我们一般这样写:

$('.list li').click(function(){
    alert(1111);
})

这样当我们点击list里面的任何一个li都可以弹出‘1111’,但这样做有两个弊端:

1.很耗费资源,因为这种方式是给每个li都加上了事件,li的个数少的话还没事,如果li多的话会很耗费资源。

2.如果后期动态添加li,不会拥有这个弹出事件。

针对以上问题,可以用事件委派来解决,我们完全可以写出这样一段代码:

 代码如下 复制代码

$(".list").delegate("li", "click", function(){    
alert(1111);
});

这个就是jquery的事件委派,有的时候还是很能派上用场的,骚年们,玩起来吧!

.live()与流行的liveQuery插件很像,但有以下几个主要区别: 
* .live 目前只支持所有事件的子集,支持列表参考上面的说明。 
* .live 不支持liveQuery提供的“无事件”样式的回调函数。.live只能绑定事件处理函数。 
* .live 没有"setup"和"cleanup"的过程。因为所有的事件是委派而不是直接绑定在元素上的。


HTML 代码:

 代码如下 复制代码

<p>Click me!</p>

$("p").live("click", function(){ 
$(this).after("<p>Another paragraph!</p>"); 
});


事件委派一次绑定多种事件

一次性绑定多个事件,根据事件类别委派相应的操作 
为了更好地优化上面的代码,可以通过事件委派来修改代码,修改后的代码如下:

 代码如下 复制代码

jQuery(function($) { 
var $liveTip = $('<div id="livetip"></div>').hide().appendTo('body'); 
var tipTitle = ''; 
$('#mytable').bind('mouseover mouseout mousemove', function(event) { 
var $link = $(event.target).closest('a'); 
if (!$link.length) { return; } 
var link = $link[0]; 
if (event.type == 'mouseover' || event.type == 'mousemove') { 
$liveTip.css({ 
top: event.pageY + 12, 
left: event.pageX + 12 
}); 
}; 
if (event.type == 'mouseover') { 
tipTitle = link.title; 
link.title = ''; 
$liveTip.html('<div>' + tipTitle + '</div><div>' + link.href + '</div>') 
.show(); 
}; 
if (event.type == 'mouseout') { 
$liveTip.hide(); 
if (tipTitle) { 
link.title = tipTitle; 
}; 
}; 
}); 
});

该段代码中一次性地将多个事件绑定到一个待处理的DOM对象之上,在代码的内部通过判断事件的类别来委派不同的处理代码。这样可以避免代码的重复定义,以达到避免时间冗余的效果。

事件委派、传递 

当列表里的一列被点击,新的列被加入列表。如果想让新加入的列也具有相同的事件控制,我们可以使用事件委派,把事件处理方法传递给新的列。

 代码如下 复制代码

$(document).ready(function() {
  $('#list2').click(function(event) {//注意:这里加入了参数:event
  var $newLi = $('<li class="special"><button>新按钮</button></li>'); 
  var $tgt = $(event.target); //注意:这里用到target函数
  if ($tgt.is('button')) { 
    $tgt.parent().after($newLi); 
  }//这里用到,is()函数来判断当前点击元素的属性,如果是按钮就触发事件。 
  }); 
});



在jQuery1.7中 .delegate()已被.on()取代。对于早期版本,它仍然使用事件委托的最有效手段。
在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的。

.delegate() 指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。

复制代码 代码如下:

// jQuery 1.4.3+
$( elements ).delegate( selector, events, data, handler );
// jQuery 1.7+
$( elements ).on( events, [selector], data, handler );

例如:.delegate()  code:
复制代码 代码如下:

$("table").delegate("td","click",function(){
 alert("hello");
});

.on()  code:
复制代码 代码如下:

$("table").on("click", "td", function() {
        alert("hi");
});

PS: 两者区别是seleter和events顺序不同
delegate和on方法被选元素的子元素必须是"合法的"子元素。比如
复制代码 代码如下:

$("table").delegate("button","click",function(){...});
$("table").on("click", "p", function(){...});

就不起作用,因为正常情况下,table子元素应为tr,td...

on(events,[selector],[data],fn),参数[selector]是可选,
一个选择器字符串用于过滤器的触发事件的选择器元素的后代。
例如:

复制代码 代码如下:

$("table").on("click", ".td1", function() {
       alert("hi");
});

过滤class为td1的table子元素

而delegate的selector是必需的。

浅谈jquery中delegate()与live()

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序
例如给id是showspan的div中的span标签添加事件

?
1
2
3
4
5
6
7
8
9
10
<div id= "showspan" ><span>showspan**showspan</span></div>
<span>outspan</span>
<SCRIPT LANGUAGE= "JavaScript" >
<!--
//效果就是点击一个段落<div id="showspan">中span标签将在span标签后面添加一个span标签,对于新增的span标签同样可以点击新增一个span标签,新增的标签不需要监听其click事件
$( "#showspan" ).delegate( "span" , "click" , function (){
    $( this ).after( "<span>showspan**showspan</span>" );
});
//-->
</SCRIPT>

live() 方法为被选元素附加一个或多个事件处理程序(不能给其子元素添加事件)
例如给p标签添加事件

?
1
2
3
4
5
6
7
8
<p class= "showp" >pppppppp</p>
<SCRIPT LANGUAGE= "JavaScript" >
<!--
$( ".showp" ).live( "click" , function (){
    $( this ).after( "<p>pppppppp</p>" );
});
//-->
</SCRIPT>

以上所述就是本文的全部内容了,希望大家能够喜欢。


目录
相关文章
|
4月前
|
关系型数据库 TensorFlow 算法框架/工具
Docker技术概论(4):Docker CLI 基本用法解析
Docker技术概论(4):Docker CLI 基本用法解析
249 1
|
3月前
|
传感器 C# Android开发
深度解析Uno Platform中的事件处理机制与交互设计艺术:从理论到实践的全方位指南,助您构建响应迅速、交互流畅的跨平台应用
Uno Platform 是一款开源框架,支持使用 C# 和 XAML 开发跨平台原生 UI 应用,兼容 Windows、iOS、Android 及 WebAssembly。本文将介绍 Uno Platform 中高效的事件处理方法,并通过示例代码展示交互设计的核心原则与实践技巧,帮助提升应用的用户体验。事件处理让应用能响应用户输入,如点击、触摸及传感器数据变化。通过 XAML 或 C# 添加事件处理器,可确保及时反馈用户操作。示例代码展示了一个按钮点击事件处理过程。此外,还可运用动画和过渡效果进一步增强应用交互性。
150 57
|
1月前
|
Dart 安全 编译器
Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析
在 Flutter 开发中,`dynamic` 类型提供了灵活性,但也带来了类型安全性问题。本文深入探讨 `dynamic` 类型及其与其他类型的转换,介绍如何使用 `as` 关键字、`is` 操作符和 `whereType&lt;T&gt;()` 方法进行类型转换,并提供最佳实践,包括避免过度使用 `dynamic`、使用 Null Safety 和异常处理,帮助开发者提高代码的可读性和可维护性。
78 1
|
3月前
|
安全 网络安全 开发工具
深入探索Git:全面解析Git的用法与最佳实践
深入探索Git:全面解析Git的用法与最佳实践
63 2
|
2月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
118 0
|
2月前
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
127 0
|
2月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
18 0
|
4月前
|
数据采集 运维 监控
运维笔记:流编辑器sed命令用法解析
运维笔记:流编辑器sed命令用法解析
61 5
|
3月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
138 0

推荐镜像

更多