jquery对页面新加元素添加事件

JQ实现向动态元素添加事件 最近做的工作需要添加微信统计,然后页面里是动态添加的模拟对话,需要给动态添加的元素添加点击复制事件。 第一就想到了JQ的bind事件,可是经过测试发现,bind事件不能给动态添加的元素进行事件添加,不能放弃啊,继续探索,终于功夫不负有心人,发现on事件可以实现这个效果。废话不多说,上代码: <!DOCTYPE html> <html> <head> ... 阅读详情

今天遇到一个问题,页面动态添加的的<a>标签无法添加事件!on,bind 两种jQuery方法都用了也不好使!然后看到网上有一个live方法用了一下挺好用,可以添加事件。达到了预期效果!

DOM树

首先,可视化一个HMTL文档的DOM树是很有帮助的。一个简单的HTML页面看起来就像是这个样子:
事件冒泡(又称事件传播)
当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行。
复制代码代码如下:

$('a').bind('click',function(){alert('that tickles!')}) 

因此一个单击操作会触发alert函数的执行。
click事件接着会向树的根方向传播,广播到父元素,然后接着是每个祖先元素,只要是它的某个后代元素上的单击事件被触发,事件就会传给它。
在操纵DOM的语境中,document是根节点。
现在我们可以较容易地说明.bind()、.live()和.delegate()的不同之处了。
.bind() 
复制代码代码如下:
$('a').bind('click',function(){alert('That tickles!');})

这是最简单的绑定方法了。JQuery扫描文档找出所有的$(‘a')元素,并把alert函数绑定到每个元素的click事件上。 
.live() 
复制代码代码如下:
$('a').live('click',function(){alert('That tickles!')})

JQuery把alert函数绑定到$(document)元素上,并使用'click'和'a'作为参数。任何时候只要有事件冒泡到document节点上,它就查看该事件是否是一个click事件,以及该事件的目标元素与'a'这一CSS选择器是否匹配,如果都是的话,则执行函数。 
live方法还可以被绑定到具体的元素(或“context”)而不是document上,像这样: 
复制代码代码如下:
$('a',$('#container')[0]).live('click',function(){alert('That tickles!')})

.delegate() 
复制代码代码如下:
$('#container').delegate('a','click',function(){alert('That tickles!')})


JQuery扫描文档查找$('#container'),并使用click事件和'a'这一CSS选择器作为参数把alert函数绑定到$('#container')上。任何时候只要有事件冒泡到$('#container')上,它就查看该事件是否是click事件,以及该事件的目标元素是否与CSS选择器相匹配。如果两种检查的结果都为真的话,它就执行函数。 
可以注意到,这一过程与.live()类似,但是其把处理程序绑定到具体的元素而非document这一根上。精明的JS'er们可能会做出这样的结论,即$('a').live() == $(document).delegate('a'),是这样吗?嗯,不,不完全是。 
为什么.delegate()要比.live()好用 
基于几个原因,人们通常更愿意选用jQuery的delegate方法而不是live方法。考虑下面的例子: 
复制代码代码如下:
$('a').live('click', function() { blah() });

或 
$(document).delegate('a', 'click', function() { blah() }); 
后者实际上要快过前者,因为前者首先要扫描整个的文档查找所有的$(‘a')元素,把它们存成jQuery对象。尽管live函数仅需要把'a'作为串参数传递以用做之后的判断,但是$()函数并未“知道”被链接的方法将会是.live()。 

而另一方面,delegate方法仅需要查找并存储$(document)元素。 
一种寻求避开这一问题的方法是调用在$(document).ready()之外绑定的live,这样它就会立即执行。在这种方式下,其会在DOM获得填充之前运行,因此就不会查找元素或是创建jQuery对象了。 
灵活性和链能力
live函数也挺令人费解的。想想看,它被链到$(‘a')对象集上,但其实际上是在$(document)对象上发生作用。由于这个原因,它能够试图以一种吓死人的方式来把方法链到自身上。实际上,我想说的是,以$.live(‘a',…)这一形式作为一种全局性的jQuery方法,live方法会更具意义一些。
仅支持CSS选择器
最后一点,live方法有一个非常大的缺点,那就是它仅能针对直接的CSS选择器做操作,这使得它变得非常的不灵活。
欲了解更多关于CSS选择器的缺点,请参阅Exploring jQuery .live() and .die()一文。
更新:感谢Hacker News上的pedalpete和后面评论中的Ellsass提醒我加入接下来的这一节内容。
为什么选择.live()或.delegate()而不是.bind()
毕竟,bind看起来似乎更加的明确和直接,难道不是吗?嗯,有两个原因让我们更愿意选择delegate或live而不是bind:
1. 为了把处理程序附加到可能还未存在于DOM中的DOM元素之上。因为bind是直接把处理程序绑定到各个元素上,它不能把处理程序绑定到还未存在于页面中的元素之上。
2. 如果你运行了$('a').bind(…),而后新的链接经由AJAX加入到了页面中,则你的bind处理程序对于这些新加入的链接来说是无效的。而另一方面live和delegate则是被绑定到另一个祖先节点上,因此其对于任何目前或是将来存在于该祖先元素之内的元素都是有效的。
3. 或者为了把处理程序附加到单个元素上或是一小组元素之上,监听后代元素上的事件而不是循环遍历并把同一个函数逐个附加到DOM中的100个元素上。把处理程序附加到一个(或是一小组)祖先元素上而不是直接把处理程序附加到页面中的所有元素上,这种做法带来了性能上的好处。
停止传播
最后一个我想做的提醒与事件传播有关。通常情况下,我们可以通过使用这样的事件方法来终止处理函数的执行:
复制代码代码如下:

$('a').bind('click',function(e){ 
e.preventDefault() 
e.stopPropagation()} 
) 

不过,当我们使用live或是delegate方法的时候,处理函数实际上并没有在运行,需要等到事件冒泡到处理程序实际绑定的元素上时函数才会运行。而到此时为止,我们的其他的来自.bind()的处理函数早已运行了。

全网最详细的UAVCAN/DroneCAN链路开发(官方DroneCAN消息+自定义DroneCAN消息)附DroneCAN项目源码 全网最详细的UAVCAN/DroneCAN链路移植开发(官方DroneCAN消息+自定义DroneCAN消息)附工程移植源码 阅读详情

相关推荐

macOS Monterey官方镜像高速下载指南(附迅雷链接+兼容性清单)

本文提供macOS Monterey官方镜像的高速下载指南,重点介绍利用迅雷等工具加速下载官方安装包的有效方法。同时,详细列出了系统兼容性清单,帮助用户在下载前确认设备支持,并分享了从下载、验证到安全安装的完整流程与常见问题解决方案。

j7k8l的博客 2197

jQuery中.bind() 方法?

.bind() 方法1、定义及用法:向被选元素添加 一个或多个事件和事件触发时运行的函数。                         (jQuery版本1.7起,on()方法是首选)。2、简单   示例: 向&lt;p&gt;元素添加一个点击事件                              $("p").bind("click",function(){             ...

墓亦龍的博客 1144

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+

jQuery的.bind()、.live()和.delegate()之间区别

DOM树 首先,可视化一个HMTL文档的DOM树是很有帮助的。一个简单的HTML页面看起来就像是这个样子: 事件冒泡(又称事件传播) 当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行。 1 $('a').bind('click',function(){alert('that tickles!')...

weixin_30339457的博客 229

在Proteus中用80C51模拟4线SPI点亮OLED屏幕

在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。

Connor3093的博客 5004

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码,有详细注释。适合初学者熟悉opengl使用。

张竞成的博客 1万+

JQuery:动态添加标签绑定事件

说明 采用JQuery技术先获取页面元素,然后再在后面追加元素的时候(append),在下面用 $(selector) 获取刚刚添加的标签,发现怎么都获取不到。 之所以这样原因是因为页面已经将JS加载完毕,此时新增请求动态添加节点,自然获取不到。 动态添加的标签要事件委托才能获取到节点,具体解决办法: 通过on绑定事件(注意使用on绑定事件时,hover无效,因为on的参数只能传一个函数) li...

哈 3547

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记-----GCN在交通领域的应用(二) 一、论文翻译: 1、摘要: 及时准确地交通预测对于城市交通控制和指导具有至关重要的意义。由于交通流量的非线性和复杂性,传统的方法不能满足中长期预测任务的需求,并且往往会忽略时空数据的时间和空间依赖特性。在这篇论文中,为了处理在交通领域的时间序列预测问题...

cy_believ的博客 1916

jQuery给动态添加的元素绑定事件的方法

jquery中绑定事件一般使用bind,或者click,但是这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定。在1.7版本以前使用live。但是在1.8版本以后推荐使用on。这里介绍jQuery中如何给动态添加的元素绑定事件在实际开发中会遇到要给动态生成的html元素绑定触发事件的情况 例如 1 <div id="testdiv"> 2 <u...

weixin_33743248的博客 216

使用Python爬虫抓取旅游景点评价数据并进行热度可视化

景点热度通常由景点的评分、评论数以及游客的热情度来决定。高热度的景点通常意味着更高的游客评分和更多的游客评论。热度不仅反映了景点的受欢迎程度,还可以揭示某些景点的潜力和存在的问题。评分:游客对景点的综合评分,通常是0到5分。评论数:景点的评论数量,反映了游客对景点的关注程度。热度变化:在一定时间内,景点的评价和评论数量变化,能够反映景点的热度波动。通过使用Python爬虫技术抓取旅游景点的评价和评论数据,我们能够深入分析景点的热度,并通过数据可视化工具将这些信息展示给用户。

2201_76125261的博客 1282

【WRF工具】WRF Domain Wizard第一期:软件下载及安装

【WRF工具介绍】WRF Domain Wizard-确定模拟区域

WW、forever的博客 2918

学会区别 $().live() 、 $().bind() 、$().delegate()

在修改项目的BUG的时候,遇到一个简单的问题,当时不是很清晰。 事件冒泡 其实就是事件的传播,是往根传播的。代码上看起来像是从里往外传播。DOM模型上是从下往上传播。 DOM模型: 一个简单的列子就是,我们在a标签定义一个alert函数之后,他会怎么冒泡呢? 他是这样传播的: 这个冒泡机制弄明白了,接着就是我的问题了 那么Jquery中

个人新博客: https://cbbfcd.github.io/ 1238

【MODBUS】Java实现的Modbus协议类库——推荐j2mod库

Jamod是另一个开源的Modbus Java库。这个库的设计是完全面向对象的,基于抽象,应该支持易于理解、可重用性和可扩展性。它支持Modbus RTU和Modbus TCP,并且提供了主站和从站的功能。这是jamod Modbus库的一个分支,取自1.2.1版本,根据Apache 2许可证发布,包含在该项目的SVN存储库中。j2mod项目的目标是基于Java编程语言生成一个功能更全面的Modbus(tm)通信库。这是一个积极开发的项目,接受具有Modbus主站和从站开发经验的专业软件工程师提交的文件。

开源物联网项目商业化作者 5639

jQuery(三)添加/删除/替换/克隆元素、事件

JavaScript jQuery:添加/删除/替换/克隆、事件。

商务合作 | 共同学习 | 携手共进 4万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jQuery-为动态添加的元素绑定事件

在使用jquery的方式为元素绑定事件时,我经常使用bind或者click,但这只能为页面已经加载好的元素绑定事件。像需要用ajax的方式请求远程数据来动态添加页面元素时,显然以上几种绑定事件的方式是无效的。$("#searchMoveVideoResult ul li").bind("click",function(){ $(this).css("border","5px solid #000

H小志 7万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jquery在新增加的元素上添加事件方法

最近项目组需要在新增的元素上增加时间,有人说用live方法后来使用的时候发现jquery没有该方法(1.7以上就没了)替换为on  除了jquery api官方的例子外还有以下的例子可以在新增的元素上添加时间 $(document).on("click",'#lyysb a',function(){ if(!$(this).hasClass('cur')){ $(this).add

zhuyangxing的专栏 5871

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Ajax成功添加新DOM元素 jquery 绑定元素事件

开始之前,我要强调一件事情,看API事件很重要的事情,看API事件很重要的事情,看API事件很重要的事情!(真的很重要啊!)为了要保证加载完页面上的DOM元素,再用jquery进行绑定相应的元素我们通常都用 $(document).ready(function(){这里放代码});或$(function(){这里放代码});那么问题来了,如果页面上有通过 ajax 进行请求则成功返回有添加新的DO

BJ的专栏 6578

JQuery 动态生成元素添加点击事件

页面代码 <html> ... <body> <div id="divBox"></div> <script> $(function(){ $("#divBox").append("<img class='preview_image' src='/img/preview1.jpg' />"); $("#divBox").append("<img class='preview_image' src='/img/pre

sayyy的专栏 8362

jquery动态添加元素和动态添加click事件

文章目录1.动态追加HTML元素2.获取HTML已有元素3.静态元素添加点击事件4.动态创建btn并添加事件5.不好使的原因6.动态创建的元素添加click事件正确姿势 1.动态追加HTML元素 function appendText() { var txt1 = "&lt;p&gt;Text.&lt;/p&gt;"; // Create element with...

my_live_123 7162

给Jquery动态添加的元素绑定事件

给Jquery动态添加的元素绑定事件 我想很多人都会向我一样曾经 被新元素的事件绑定困惑很久也就是 在页面加载完成后给元素绑定了事件,但又新增加的元素上却没有绑定任何事件。 js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现。而事件监听不是,你必须给每一个元素单独绑定事件。 常见的例子是处理表格的时候。每行行末有个删除按钮,点

新元 2511

JQuery关于如何为动态添加元素绑定事件

JQuery关于如何新增元素绑定事件 事例如下: 头部: <head> <meta charset="UTF-8"> <title></title> // ==================style可以忽略,这里只是为了能够看清做的简单样式================ <style> div{ mar...

码农米格的博客 810

jquery 点击事件点击元素添加和移除class

jquery 点击事件点击元素添加和移除class 怎么实现点击一个元素给它添加class,再点击一个元素移除上一个元素的class,再给现在点击的元素添加class <div class="swiper-wrapper"> <div class="swiper-slide red-slide active"> <p>热门</p> </div&...

weixin_37913331的博客 4400

jquery动态添加元素后,元素的事件无效(已解决)

jquery动态添加元素后,元素的事件无效(已解决) 基于jquery1.9以上版本作的解决方案 先贴一段正常逻辑写的代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script src="jquery-3.3.1.js" type

weixin_38064520的博客 4111

使用jquery如何给后来添加的元素也增加监听事件

问题描述:想要给id="abc"的div追加一个新的div,并且让新div具有“单击事件”的监听 原始状态 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8" /&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&

玄昌盛不会编程 4082

jquery动态添加元素事件绑定与获取

jquery动态添加元素时间绑定与获取 关于为动态添加的元素添加绑定事件网上有很多的文章,介绍的很详细,下面是主要代码: html: <div id="i_fileusers"> <table id="table_limit" ></table> </div> 动态添加: $.ajax({ url:"/sysManage/getFileLi...

u014337925的博客 925

解决jQuery的each遍历不到新添加的元素

我通过js动态添加li,然后通过jq的each遍历的时候遍历不到新添加的元素。 <div class="goodDiv"> <li class="mui-table-view-cell" style="border-bottom: #0d0d0d;" > <div class="mui-input-row" style="height:50p...

bb159632478的博客 1616
上一篇: 用gson转json时报stackoverflowerror
下一篇: List集合中的对象排序
qq_25041295
博客等级 码龄12年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值