jQuery的.live()和.die()

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

很多开发者都知道jQuery的.live()方法,他们大部分知道这个函数做什么,但是并不知道是怎么实现的,所以用的并不那么舒适。而且他们却从未听过还有解除绑定的.live()事件的.die()方法。即使你熟悉这些,但是你意识到.die()了吗?

什么是 .live()

.live方法类似于.bind(),除此之外,它允许你将事件绑定到DOM元素上,可以将事件绑定到DOM中还不存在的元素上,看看下面的例子:

比方说当用户在点击链接时及想提示他们正在离开站点。

?
1
2
3
4
5
6
$(document).ready(function() {
$('a').click(function() {
alert("You are now leaving this site");
return true;
});
});

注意,.click()仅仅是个实现更一般.bind()的简单方法,下面和上面的代码相当于上面的实现。

?
1
2
3
4
5
6
$(document).ready(function() {
$('a').bind('click',function() {
alert("You are now leaving this site");
return true;
});
});

但是现在通过javascript添加一个链接到页面。

?
1
$('body').append('<div><a href="...">Check it out!</a></div>');

然而当用户点击那个链接是,方法将不会被调用,因为那个链接当你将click事件绑定到页面的所有<a>节点时还并不存在,所以我们就用.live()替换.bind():

?
1
2
3
4
5
6
$(document).ready(function() {
$('a').live('click',function() {
alert("You are now leaving this site");
return true;
});
});

现在如果你添加一个新的链接到页面上,绑定就也可以运行了。

.live() 如何工作

.live()背后神奇的地方就在于它并不将事件绑定到你选定的elements上,而实际上是绑定到了DOM树的跟节点(例子中是$(document)),而是在element中就像一个参数一样进行传递。

那么当你点击一个元素时,click事件就会在DOM树上往上传递,直至到达根节点。这个.click()事件的触发器已经在根节点被.live()创建。这个触发方法将首先检测被点击的目标看是否和.live()调用的选择器相匹配。所以上面的例子中,会检查点击的元素是否和$('a').live()中的$('a')相匹配,如果匹配,那么绑定的方法就会执行了。

因为不管你在根节点内点击了什么,根节点的.click()事件都会被触发,当你点击加入到根节点的任何元素时这个检查都会发生。

所有.live() 都可以.die()

如果你知道.bind(),那么你肯定知道.unbind()。那么,.die()和.live()就是类似的关系了。为了接触上面的绑定(不希望用户点击链接时弹出对话框),我们这么做:

?
1
$('a').die();

更具体点,如果还有其他的事件被绑定且需要保留,例如hover或其他,可以只解除click事件绑定。

?
1
$('a').die('click');

再具体些,如果已经定义了方法名,可以解除绑定指定的方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
specialAlert =function() {
alert("You are now leaving this site");
return true;
}
$(document).ready(function() {
$('a').live('click', specialAlert );
$('a').live('click', someOtherFunction );
});
// then somewhere else, we could unbind only the first binding
$('a').die('click', specialAlert );

关于 .die()的问题

使用这些函数时,.die()方法会有一个缺点。只可以使用.live()方法中用到的元素选择器,例如,不可以像下面这样写:

?
1
2
3
4
5
6
7
8
9
10
$(document).ready(function() {
$('a').live('click',function() {
alert("You are now leaving this site");
return true;
});
});
// it would be nice if we could then choose specific elements
//   to unbind, but this will do nothing
$('a.no-alert').die();


.die()事件看起来好像是匹配到了目标选择权并解除了.live()的绑定,但事实上,$('a.no-alert')并不存在绑定,所以jquery找不到任何绑定去去掉,就不会起作用了。

更糟的是下面这个:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
$(document).ready(function() {
$('a,form').live('click',function() {
alert("You are going to a different page");
return true;
});
});
// NEITHER of these will work
$('a').die();
$('form').die();
// ONLY this will work
$('a,form').die();

如何修复 .die()

在我下篇文章中,我将会建议一种.die()执行的新方法,它可以提供一个向后兼容的语气的行为。或许我有时间的话会去建议jQuery核心开发团队在下一个release中接受我的建议并进行修改,希望多一点我刚写的这些方法,包括可选的context参数,允许自定义事件附加的节点,而不是根节点。

如果想得到更多的信息和例子,可以查查jQuery .live() and .die().的文档

同时注意下 .delegate() 和.undelegate(),他们可以替代.live()和.die(),它们联系很紧密。

转载于:https://my.oschina.net/u/861770/blog/102956

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简洁强大的JavaWeb框架Blade

English Blade是什么? blade 是一个轻量级的MVC框架. 它拥有简洁的代码&#xff0c;优雅的设计。 如果你喜欢,欢迎 Star and Fork, 谢谢! 特性 [x] 轻量级。代码简洁,结构清晰,更容易开发[x] 模块化(你可以选择使用哪些组件)[x] 插件扩展机制[x] Restful风格的路由接口[x] 多种…

SQL SERVER 数据压缩

从SQL SERVER 2008开始&#xff0c;SQL SERVER 提供了对数据进行压缩的功能&#xff0c;启用数据压缩无须修改应用程序。 数据压缩可有效减少数据的占用空间&#xff0c;读取和写入相同数据花费的IO也响应减少&#xff0c;从而可以有效缓解IO压力&#xff0c;但由于数据在读取和…

C语言基本数据类型short、int、long、char、float、double

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1.概述 C 语言包含的数据类型如下图所示 2.各种数据类型介绍 2.1整型 整形包括短整型、整形和长整形。 2.1.1短整形 short a=1; 2.1.2整形 一般占4个字节(32位),…

oracle存储回车换行,oracle中去掉回车换行空格的方法详解

去除换行update zhzl_address t set t.add_administration_numreplace(t.add_administration_num,chr(10),);去掉回车update zhzl_address t set t.add_administration_numreplace(t.add_administration_num,chr(13),);去掉空格update zhzl_address t set t.add_administration…

是的,我打败了一个奥特曼。

全世界只有3.14 % 的人关注了爆炸吧知识春节将至&#xff0c;超模君给各位带来了春节好礼——《数学之旅闪耀人类的54位数学家》文化礼盒&#xff0c;集结阿基米德、欧几里得、芝诺、高斯、欧拉等54位数学家&#xff0c;跨越2600年的数学之旅&#xff0c;为各位新一年的学习之旅…

博弈论之软件测试的价值

百度搜索&#xff1a;小强测试品牌挨踢脱口秀&#xff0c;将技术娱乐化&#xff0c;碎片系统化&#xff0c;尽在荔枝FM&#xff08;http://www.lizhi.fm/200893&#xff09;1、引子这段时间比较火热的话题就是公司是否需要软件测试工程师&#xff0c;N多大牛和公司领导都纷纷站…

C语言常用头文件总结

序号库类别 头文件 1 字符处理 ctype.h 2 地区化 local.h 3 数学函数 math.h 4 信号处理 signal.h 5 输入输出 stdio.h 6 实用工具程序 stdlib.h 7 字符串处理 string.h 一、头文件 ctype.h 字符测试函数 是否字母和数字 isalnum 是否字母 isalpha 是…

89C51单片机定时器控制的流水灯

/***************************************************Copyright: 2014-02-11.version1.0File name: timer.cDescription: 定时中断控制的流水灯Author: lxlVersion: version1.0Date: 2014.02.11History: 无****************************************************/#include &l…

Oracle 加密配置,Oracle sqlnet设置网络传输加密

1、查看加密组件[oracleyuntestdb ~]$ adaptersInstalled Oracle Net transport protocols are:IPCBEQTCP/IPSSLRAWSDP/IBInstalled Oracle Net naming methods are:Local Naming (tnsnames.ora)Oracle Directory NamingOracle Host NamingOracle Names Server NamingInstalled…

你有多少个前男友?

1 给我整不会了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 这是送分题还是送命题&#xff1f;▼3 有梦想谁都了不起&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 &#xff1f;&#xff1f;&#xff08;via.偷听bot&#xff0c;侵删&#xff09;…

apache服务器搭建过程中需要注意到的一些问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/chengyi_L/article/details/51423390 1.日志切分 windows: 利用自带工具 rotatelogs切分access.log和error.log ErrorLog "|bin/rotatelogs.exe logs/apache_error-%Y-%…

C实现记录个人资料

代码: #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h>struct Family *get_person(void); /* Prototype for input function */ char related(struct Family *pmember1, struct Family *pmember2); char set_ance…

Hibernate type 与java 和 数据库类型对应

Hibernate type 属性 内置的 basic mapping types 可以大致地分类为&#xff1a; integer, long, short, float, double, character, byte, boolean, yes_no, true_false这些类型都对应 Java 的原始类型或者其封装类&#xff0c;来符合&#xff08;特定厂商的&#xff09;SQL 字…

Log4j.properties 配置详解

一、Log4j简介 Log4j有三个主要的组件&#xff1a;Loggers(记录器)&#xff0c;Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别&#xff0c;日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别&#xff0c;并可以在运行时…

oracle查询表占用空,Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询...

--表名,表占用空间大小(MB),行数select table_name, round(num_rows * avg_row_len /1024/1024, 8) as total_len, num_rowsfrom user_tableswhere table_name ‘表名‘order by table_name;--表名,列名,列占用空间大小(MB),非空行数select c.table_name, c.column_name, roun…

双链表的实现

#include <stdio.h> #include <string.h> #include <stdlib.h> #define N 10 typedef struct node {char name[20];struct node *llink,*rlink; }stud;/*双链表的结构定义*//*双链表的创建*/ stud * creat(int n) {stud *p,*h,*s;int i;if((h=(stud *)malloc…

里程碑!中文版.NET官网发布,.NET开发起飞!

重磅官宣&#xff0c;微软.NET官网正式发布简体中⽂版&#xff0c;而且是官方支持语言第一梯队&#xff0c;由此可见微软对中国.NET市场的重视。这些年&#xff0c;微软一直在加大.NET在中国的支持和推广&#xff0c;努力让更多传统行业、互联网公司、创业团队的中国开发者选择…

android中Camera setDisplayOrientation使用

在 写相机相关应用的时候遇到捕获的画面方向和手机的方向不一致的问题&#xff0c;比如手机是竖着拿的&#xff0c;但是画面是横的&#xff0c;这是由于摄像头默认捕获的画面byte[]是根 据横向来的&#xff0c;而你的应用是竖向的&#xff0c;解决办法是调用setDisplayOrientat…

来一个可能防止恶意采集和爬虫的SH

没办法&#xff0c;公司的要求&#xff0c;还有&#xff0c;一些山寨爬虫完全不够我们运维人员的感觉&#xff0c; 一天爬虫搞个三四十万的LOG&#xff0c;那我只好干了。。 人家GOOGLE&#xff0c;BAIDU&#xff0c;一天大约也就五六千吧。。 有一个小的SSH技巧&#xff0c;是…

C++的复习

C++的复习 1、命名空间 C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为namespace。 科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当所有人的代码测试通过,没有…