原文链接:点我

我们知道jquery提供了四种事件监听方式,分别是bind、live、delegate、on,下面就分别对这四种事件监听方式分析。

已知有4个列表元素:

  列表元素1

  列表元素2

  列表元素3

  列表元素4

1.bind

bind(type,[data],function(eventObject))  bind是使用频率较高的一种,作用就是在选择到的元素上绑定特定事件类型的监听函数,

参数函数如下:

type:事件类型,如click、change、mouseover等;

data:传入监听函数的参数,通过event.data取到;

function:监听函数,可传入event对象,这里的event是jquery封装的event对象。

源码:

 bind: function( types, data, fn ) {

 return this.on( types, null, data, fn );

 }

可以看到内部是调用了on方法。

bind的特点就是会把监听器绑定到目标元素上,有一个邦一个,在页面上的元素不会动态添加的时候使用它没有什么问题。

但如果列表中动态增加一个“列表5”,点击它是没有反应的,必须再bind一次才行。

测试代码:

 $(function(){
$('div').bind('click',function(){
if($(this).text()=='列表4'){
$(this).after('<div>列表5</div>');
}
alert($(this).text());
})
8 })

注意:jquery中append()和after()方法都可以添加元素,不同之处是append()是在要添加元素的末尾(在元素内)添加,而after()是在要添加的元素之后(在元素外)。

2.live

live(type, [data], fn)

live的参数和bind一样,它又有什么蹊跷呢,我们还是先瞄一眼源码:

 live: function( types, data, fn ) {

 jQuery( this.context ).on( types, this.selector, data, fn );

 return this;
}

可以看到live方法并没有将监听器绑定到自己(this)身上,而是绑定到了this.context上了。

通过 live() 方法添加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素),

使用事件委托的优点一目了然,新添加的元素不必再绑定一次监听器。

将上面代码中的bind改为live后,点击列表5就可以弹出“列表5”了。

注意:live方法在在 jQuery 版本 1.7 中被废弃,在版本 1.9 中被移除,官方建议使用on代替。

测试代码:

 $(function(){
$('div').live('click',function(){
if($(this).text()=='列表4'){
$(this).after('<div>列表5</div>');
}
alert($(this).text());
})
})

3.delegate
    将监听事件绑定在就近的父级元素上,
源码:

 delegate: function( selector, types, data, fn ) {       

  return this.on( types, selector, data, fn );
}

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,

并规定当这些事件发生时运行的函数。
这下,我们的选择又多了一些灵活性,不单可以利用事件委托,还可以选择委托的对象。
代码,实现效果,点击div,两个p标签的文字颜色都发生变化。 <div>

   <p>div内的p标签</p>
</div>
<p>div外的p标签</p>
$(function(){
$('div').delegate('p','click',function(){
$('p').css('color','blue');
});

4、on
   on(type,[selector],[data],fn)
参数与delegate差不多但还是有细微的差别,首先type与selector换位置了,其次selector变为了可选项。
on() 方法在被选元素及子元素上添加一个或多个事件处理程序。
自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品。
代码,实现效果同上,把delegate改为on,第一个参数为click,第二个参数p可写可不写,第三个参数同上。

 $(function(){
$('div').on('click','p',function(){
$('p').css('color','red');
});

jQuery中四种事件监听的区别的更多相关文章

  1. Android点击Button按钮的四种事件监听方法总结

    首先我们在activity_main.xml里面先定义一个Button空间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <RelativeLayout xmlns:a ...

  2. jQuery EasyUI/TopJUI输入框事件监听

    jQuery EasyUI/TopJUI输入框事件监听 代码如下: <div data-toggle="topjui-panel" title="" da ...

  3. 从jQuery的缓存到事件监听

    不知道大家有没有发现,用jQuery选择器"选择"之后的DOM上会添加jQuery*********属性. <DIV id=d1 jQuery1294122065250=&q ...

  4. VMware中四种网络连接模式的区别

    安装好VMwareWorkstations之后,进行虚拟机网络配置时有四种网络连接方式,桥接.仅主机.NAT.LAN区段. 之所以有不同的模式,在我看来是为了满足不同的网络需求,总的来说:桥接.NAT ...

  5. Android 开发中的View事件监听机制

    在开发过程中,我们常常根据实际的需要绘制自己的应用组件,那么定制自己的监听事件,及相应的处理方法是必要的.我们都知道Android中,事件的监听是基于回调机制的,比如常用的OnClick事件,你了解它 ...

  6. onscroll事件没有响应的原因以及vue.js中添加onscroll事件监听的方法

    1 onscroll事件失效 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  7. clipboard 在 vue 项目中,on 事件监听回调多次执行

    clipboard 定义一个全局变量 import ClipboardJS from "clipboard"; if(clipboard){ clipboard.destroy() ...

  8. java中的key事件监听机制

    package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.sw ...

  9. jquery easyui控件事件监听委托给jquery事件监听,keyup取最新值问题

    <div id="<?php echo NS; ?>toolbar"> <div style="padding:5px"> ...

随机推荐

  1. Ubuntu ctrl+alt会导致窗口还原的问题

    Ubuntu ctrl+alt会导致窗口还原的问题 本来以为是compizConfig的问题,后来在系统config中找到键盘>快捷键:恢复窗口,删除这个快捷键,就好了: 原来这里写的是ctrl ...

  2. codevs1052

    题目地址:http://codevs.cn/problem/1053/ 分析: 模拟 代码: var s:string; a:array['a'..'z'] of longint; i,j,t,n:l ...

  3. linux下修改完profile文件的环境变量后如何立即生效

    方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # . /etc/profile 注意: . 和 /etc/profile 有空格 方法2: 让/etc/profile文 ...

  4. 用jquery给select加选中事件

    select在前端开发过程中很常用,现在我们要实现一个效果,那就是选中select中的某一项,执行事件,本来自己没怎么接触过这些,最后网上找了一些资料,自己研究了一下,把方法分享给大家,大家如果有需要 ...

  5. deque 归纳

    deque是STL里面的常见容器,它的本质是一个队列,但是与队列不同是的是,它可以两边进出. 下面是STL的一些常见操作. que.assign(beg,end) 将[beg; end)区间中的数据赋 ...

  6. POJ 3173 模拟

    按照题意模拟就好-- //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; in ...

  7. Hadoop框架基础(一)

    ** Hadoop框架基础(一)     学习一个新的东西,传统而言呢,总喜欢漫无目的的扯来扯去,比如扯扯发展史,扯扯作者是谁,而我认为这些东西对于刚开始接触,并以开发为目的学者是没有什么帮助的,反而 ...

  8. NOIP2017 Day-1 模板荟萃

    #include<bits/stdc++.h> #define MAXN 100005 using namespace std; int read(){ ;char c=getchar() ...

  9. Linux权限管理(用户、组、文件管理)

    一. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 1. 文件查看类命令cat,tac, head, tail, more, less, ls ,file: -ls : l ...

  10. Delayer 基于 Redis 的延迟消息队列中间件

    Delayer 基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP.Golang 等多种语言客户端. 参考 有赞延迟队列设计 中的部分设计,优化后实现. 项目链接:http ...