给Jquery动态添加的元素添加事件2

jquery为动态添加元素添加事件

还有这里:http://www.cnblogs.com/dumuqiao/archive/2011/09/09/2172511.html

Event names and namespaces(事件名称和命名空间)

http://www.css88.com/jqapi-1.9/on/

任何事件的名称,可以作为events 参数。jQuery将通过所有浏览器的标准JavaScript事件类型,当用户操作事件,如click,浏览器会调用handler参数的函数。此外,.trigger()方法可以触发标准的浏览器事件 和 自定义事件名绑定的处理程序。

事件名称可以添加指定的event namespaces(命名空间) 来简化删除或触发事件。例如,"click.myPlugin.simple"为 click 事件同时定义了两个命名空间 myPlugin 和 simple。通过上述方法绑定的 click 事件处理,可以用.off("click.myPlugin") 或 .off("click.simple")删除绑定到相应元素的Click事件处理程序,而不会干扰其他绑定在该元素上的“click(点击)” 事件。命名空间类似CSS类,因为它们是不分层次的;只需要有一个名字相匹配即可。以下划线开头的名字空间是供 jQuery 使用的。

.on()方法的第二种用法中,events参数是一个JavaScript对象或者键值对。键等同于events参数,用空格分隔的事件名称字符串和可选命名空间。每个键的值是一个函数(或false 的值),相当于 handler 参数,但是该值并不是方法中的最后一个参数。在其它方面,这两种形式在下面描述的内容中其行为都是相同的。如下所述。

.bind().live(), 和 .delegate()之间的区别并不明显。但是理解它们的不同之处有助于写出更简洁的代码,并防止我们的交互程序中出现没有预料到的bug。

基础

DOM树

首先,图形化的HTML文档能帮助我们更好的理解。一个简单的HTML页面看起来应该像这样

事件冒泡(也称作事件传递)(Event bubbling aka event propagation)

点击一个链接,触发绑定在链接元素上的 click 事件,进而触发绑定到这个元素的click事件的函数。

?


1

$(‘a‘).bind(‘click‘function() { alert("That tickles!") });

  

所以一次点击会触发一个alert。

然后,这个 click 事件会从DOM树向上传递,传播到父元素,然后传递给每一个祖先元素。

在DOM树中, document 是根节点。
现在我们能容易的解释.bind().live(), 和 .delegate()之间的差别了

.bind()

?


1

$(‘a‘).bind(‘click‘function() { alert("That tickles!") });

  

这是最直接的绑定方法。jQuery 扫描文档找到所有 $(‘a’) 元素,然后给每一个找到的元素的 click 事件绑定处理函数。

.live()

?


1

$(‘a‘).live(‘click‘function() { alert("That tickles!") });

  

  jQuery绑定处理函数到 $(document) 元素,并把 ‘click’ 和 ‘a’ 作为函数的参数。有事件冒泡到document节点的时候,检查这个事件是不是 click 事件,target element能不能匹配 ‘a’ css选择器,如果两个条件都是true,处理函数执行。

live方法也可以绑定到指定的元素(或者说“上下文(context)”)而不用绑定到document,比如:

?


1

$(‘a‘, $(‘#container‘)[0]).live(...);

  

.delegate()

?


1

$(‘#container‘).delegate(‘a‘‘click‘function() { alert("That tickles!") });

  

jQuery扫描文档找到 $(‘#container’),绑定处理函数到他的 click 事件,’a’ css选择器作为函数的参数。当有事件冒泡到 $(‘#container’),检查事件是不是 click,并检查target element是不是匹配css选择器,如果两者都符合,执行函数。

注意这次和 .live() 方法很相似,除了把事件绑定到特定元素与跟元素的区别。精明的JS’er 或许会总结成 $(‘a’).live() == $(document).delegate(‘a’),真的是这样吗? 不,不全是。

为什么 .delegate() 比 .live() 好

jQuery 的 delegate方法比 live 方法更应该成为首选有一个原因。考虑以下的场景:

?


1

2

3

$(‘a‘).live(‘click‘function() { blah() });

// or

$(document).delegate(‘a‘‘click‘function() { blah() });

  

速度

上面第二个执行比第一个快,因为第一个会遍历整个文档查找 $(‘a’) 元素,并保存为jQuery对象,但是live方法只需要传一个字符串参数’a‘而已,$() 方法并不知道我们会用链式表达式在后面用上.live()。

delegate 方法就只需要找到并存贮 $(document)元素就够了。

有一种hack是在 $(document).ready()之外调用live方法,这样就会立即执行。这时候DOM还没有填充,也就不会查找元素或创建jQuery对象。

灵活性和链式语法

这方面live方法依然令人费解。想一下,它链在$(‘a’)对象,但实际上是在$(document)对象起作用。因为这个原因,在链式表达式中使用live让人很不安,我觉得live方法变成一个全局的jQuery方法 $.live(‘a’,…) 会更有意义。

只支持css选择器

最后,live方法有一个最大的缺点,只能用css选择器,用起来很不方便。

有关css选择器的缺点,参看 Exploring jQuery .live() and .die()

原作者更新

为什么使用 .live() 或 .delegate() 而不用 .bind()

最后,bind 方法看起来更清晰,更直接,是吗?但是这里有两个原因我们推荐 delegate 或 live:

  • 绑定事件处理函数到还不存在DOM中的元素。 bind 方法直接绑定函数到每个单独的元素,不能绑定到还没有添加到页面里的元素,如果你写了$(‘a’).bind(…),然后用ajax给页面增加了新的链接,新添加的链接不会绑定事件。live 或 delegate 或者其它绑定到祖先元素的事件,让现在有的元素,或者以后增的元素都可以使用。
  • 绑定处理函数到一个元素或者少数几个元素,监听后代元素,而不是绑定100个相同的处理函数到单独的元素。这样更有性能优势。

阻止冒泡

最后注意一下事件冒泡。通常我们能用这样的方法阻止其他处理函数:

?


1

2

3

4

5

$(‘a‘).bind(‘click‘function(){

e.preventDefault();

//or

e.stopPropagation();

})

  其实关于live被删除的事件早就在1.7.2版本以后就有通知过了 不过在官方一直提倡使用.on代替.live的过程中 .live事件一直沿用

今天更新了 看下jQuery1.9的相关信息 发现api中完全的删除掉了.live事件

我猜肯定有人关于.on事件 并没有以前.live事件那么好用 甚至有的时候绑定不上事件

其实关于这个答案是这样的, .on事件不同于以往的.live和.bind事件使用方法:

$(‘selecter‘).live(‘click‘, function(){ // do something... });

而转到.on事件应该这样:

$(document).on(‘click‘, ‘selecter‘, function(){ // do something... });

而.on事件可以完全代替以往的.bind, .delegate等事件

// Bind$( "#members li a" ).on( "click", function( e ) {} ); $( "#members li a" ).bind( "click", function( e ) {} );

// Live$( document ).on( "click", "#members li a", function( e ) {} ); $( "#members li a" ).live( "click", function( e ) {} );

// Delegate$( "#members" ).on( "click", "li a", function( e ) {} ); $( "#members" ).delegate( "li a", "click", function( e ) {} );

但是在这里,用 live 或 delegate 方法绑定的事件会一直传递到事件真正绑定的地方才会执行。这时其他的函数已经执行过了。

以前我们定义事件,比如为元素定义单击事件是这样写的:

代码如下:

$(‘input‘).click(function () {
//处理代码
});

代码如下:

$(‘.clickme‘).bind(‘click‘, function() {
// Bound handler called.
});

但是这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定。即使你使用jquery的clone函数,它并不能将事件也复制(到目前为止我还不清楚它是为什么这样定义,是没法复制还是刻意这么处理,以防止出现某些异常,这还有待去分析一下jquery的源代码)。
现在,使用live你可以轻松搞定,

$(‘.clickme‘).live(‘click‘, function() { // Live handler called. });这样,你即使在后面动态插入的元素,也会被绑定事件,$(‘body‘).append(‘<div class="clickme">Another target</div>‘);
定义和用法
live() 方法为被选元素附加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。

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

问题:使用jQuery的live()方法绑定事件,有时会出现重复绑定的情况,如,当点击一个按钮时,此按钮所绑定的事件会并执行n遍。

解决:使用die()方法,在live()方法绑定前,将此元素上的前面被绑定的事件统统解除,然后再通过live()方法绑定新的事件。

Js代码
//先通过die()方法解除,再通过live()绑定
$("#selectAll").die().live("click",function(){
//事件运行代码
});
//先通过die()方法解除,再通过live()绑定
$("#selectAll").die().live("click",function(){
//事件运行代码
});die()方法简介:

Js代码
die([type], [fn])<SPAN style="WHITE-SPACE: normal"> </SPAN>

die([type], [fn])

概述
jQuery 1.3新增。此方法与live正好完全相反。

如果不带参数,则所有绑定的live事件都会被移除。

你可以解除用live注册的自定义事件。

如果提供了type参数,那么会移除对应的live事件。

如果也指定了第二个参数function,则只移出指定的事件处理函数。

时间: 2024-10-14 12:27:11

给Jquery动态添加的元素添加事件2的相关文章

解决jquery 动态生成的元素的事件无法绑定

一.错误示例:对于自己用脚本动态生成的元素,无法绑定事件.例如: body下的代码: <body> <ul>     <li><span class="class1">11111</span></li>     <li><span class="class1">22222</span></li>     <li><span cla

用JQuery动态为选中元素添加/删除类

在做一些tab页功能时,我们经常会见到如下样式: 即当选中一个元素时,在此元素下会添加相应的类,以示区别.今天就研究了一下如何用JQuery实现此效果. 1. HTML代码 <a id="med_specialist_1" name="med-specialist" class="med-active">专家门诊1</a> <a id="med_specialist_2" name="m

jquery动态生成的元素的事件

jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(...).live is not a function错误. 解决方法: 之前的用法: .live(events, function) 新方法: .on(eventType, selector, function) 若selector不需要,可传入null 例子1: 之前: $('#mainmenu a').live('click', function) 之后: $('#mai

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

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

jquery无法为动态生成的元素添加点击事件的解决方法

遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <div> <ul> <li> <span> <i class='icon'>这是元素内容</i> //i是动态生成 </span> </li> </ul> </div> 解决方法如下: $(docu

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

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

WEB前端技巧之JQuery为动态添加的元素绑定事件

jquery 为动态添加的元素绑定事件 如果直接写click函数的话,只能把事件绑定在已经存在的元素上,不能绑定在动态添加的元素上 可以用delegate来实现 .delegate( selector, eventType, handler ) 例如示例: $('someUlSelector').delegate('someLiSelector','click',function(){ //codes... //$(this) for the current jquery instance of

[转载]给Jquery动态添加的元素添加事件

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

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

样例: $("#modify_nick").click(function () { $(this).css("display","none"); $("#nickname_span").empty(); var input = document.createElement("input"); $(input).attr("type", "text"); $(input

jquery为指定的元素添加或者删除指定样式类

jquery为指定的元素添加或者删除指定样式类:在实际应用中,可能需要为指定的元素动态的添加或者删除指定css样式类,下面就通过简短的代码做一下介绍.一.添加css样式类: $("#antzone").addClass("class"); 上面的代码为指定的元素添加指定的样式类.更多相关内容可以参阅jQuery的addClass()方法一章节.二.删除css样式类: $("#antzone").removeClass("class&qu