Jquery绑定(bind和live的区别介绍)

  • 时间:
  • 611人关注

Jquery中绑定事件有三种方法click、bind、live第一种方法很好理解,其实就和普通JS的用法差不多,只是少了一个on而已第二、三种方法都是绑定事件,另外这篇文章主要知识点是关于Jquery、绑定事件、bind、live、Jquery绑定的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

Jquery中绑定事件有三种方法

以click事件为例

(1)target.click(function(){});

(2)target.bind("click",function(){});

(3)target.live("click",function(){});

第一种方法很好理解,其实就和普通JS的用法差不多,只是少了一个on而已

第二、三种方法都是绑定事件,但是二者又有很大的不同,下面着重讲解一下,因为这个如果用到Jquery的框架的话是用的挺多的,尤其要注意二者的区别。

bind和live的区别

live方法其实是bind方法的变种,其基本功能就同bind方法的功能是一样的,都是为一个元素绑定某个事件,但是bind方法只能给当前存在的元素绑定事件,对于事后采用JS等方式新生成的元素无效,而live方法则正好弥补了bind方法的这个缺陷,它可以对后生成的元素也可以绑定相应的事件。那么live方法的这个特性是怎么实现的呢?下面来探讨一下其实现原理。

live方法之所以能对后生成的元素也绑定相应的事件的原因归结在“事件委托”上面,所谓“事件委托”就是指绑定在祖先元素上的事件可以在其后代元素上进行使用。live方法的处理机制就是把事件绑定在DOM树的根节点上,而不是直接绑定在某个元素上。举一个例子来说明:

$(".clickMe").live("click",fn);

$("body").append("<div class='clickMe'>测试live方法的步骤</div>");

当我们点击这个新增的元素时会依次发生如下步骤:

(1)生成一个click事件,传递给div来做处理

(2)由于没有事件直接绑定在div上,所以事件直接冒泡到DOM树上

(3)事件不断冒泡,直到DOM树的根节点上,默认情况下,根节点上就绑定了这个click事件

(4)执行由live绑定的click事件

(5)检测绑定事件的对象是否存在,判断是否需要继续执行绑定的事件。检测事件对象是通过检测

$(event.target).closest('.clickMe') 能否找到匹配的元素来实现的。

(6)通过(5)的测试,如果绑定事件的对象存在的话,就执行绑定的事件。

由于只有在事件发生的时候,live方法才会去检测绑定事件的对象是否存在,所以live方法可以实现后来新增的元素也可实现事件的绑定。相比之下,bind会在事件在绑定阶段就会判断绑定事件的元素是否存在,而且只针对当前元素进行绑定,而不是绑定到父节点上。

根据上面的分析,live的好处真是很大,那么为什么还要使用bind方法呢?之所以jquery要保留bind方法而不是采用live方法去替代bind,也是因为live在某些情况下是不能够完全替代bind的。主要的不同如下:

(1)bind方法可以绑定任何JavaScript的事件,而live方法在jQuery1.3的时候只支持click, dblclick, keydown, keypress,keyup,mousedown, mousemove, mouseout, mouseover, 和 mouseup.在jQuery 1.4.1中,甚至也支持 focus 和 blue

事件了(映射到更合适,并且可以冒泡的focusin和focusout上)。另外,在jQuery 1.4.1中,也能支持hover(映射到"mouseenter mouseleave")。

(2)live() 并不完全支持通过DOM遍历的方法找到的元素。取而代之的是,应当总是在一个选择器后面直接使用 .live()方法。

(3)当一个元素采用live方法进行事件的绑定的时候,如果想阻止事件的传递或冒泡,就要在函数中return false,仅仅调用stopPropagation()是无法实现阻止事件的传递或者冒泡的

码农之家
jquery 新建的元素事件绑定问题解决方案

12小时56分钟前回答

jquery 新建的元素事件绑定问题解决方案

js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现。而事件监听不是,你必须给每一个元素单独绑定事件。

常见的例子是处理表格的时候。每行行末有个删除按钮,点了这个能够删除这一行。


<table>
<tbody>
<tr>
<td>这行原来就有</td>
<td><buttonclass="del">删除</button></td>
</tr>
<tr>
<td>这行原来就有</td>
<td><buttonclass="del">删除</button></td>
</tr>
</tbody>
</table>

通常,我会这么绑定

jQuery(function($){
//已有删除按钮初始化绑定删除事件
$(".del").click(function() {
$(this).parents("tr").remove();
});
});

对于在domready之前就存在的删除按钮,一切都很完美。但如果在domready之后用js动态添加几行,那新增的几行中的这些按钮都将失去任何作用。

如何解决这个问题?以下提供4种解决方案:

0号解决方案——onclick法

如果不顾结构与行为分离的准则的话,通常,我会这么做。
注意,此时的deltr这个function必须是全局函数,得放jQuery(function($) {})外面,放里边就成局部函数了,html里的onclick就调用不到了!

<td><buttononclick="deltr(this)">删除</button></td>

jQuery(function($){
//添加行
$("#add2").click(function(){
$("#table2>tbody").append('<tr><td>新增行</td><td><button nclick="deltr(this)">删除</button></td></tr>')
});
});
//删除行的函数,必须要放domready函数外面
function deltr(delbtn){
$(delbtn).parents("tr").remove();
};

1号解决方案——重复绑定法

即,在domready的时候就给已有的元素绑定事件处理函数,
而后当新增加的元素的时候再次绑定。

<td><buttonclass="del">删除</button></td>

jQuery(function($){
//定义删除按钮事件绑定
//写里边,防止污染全局命名空间
function deltr(){
$(this).parents("tr").remove();
};
//已有删除按钮初始化绑定删除事件
$("#table3 .del").click(deltr);
//添加行
$("#add3").click(function(){
$('<tr><td>新增行</td><td><button class="del">删除</button></td></tr>')
//在这里给删除按钮再次绑定事件。
.find(".del").click(deltr).end()
.appendTo($("#table3>tbody"));
});
});

2号解决方案——事件冒泡法

利用事件冒泡的原理,我们给这个按钮的祖先元素绑定事件处理函数。
然后通过event.target这个对象来判断,这个事件是不是我们要找的对象触发的。
通常可以利用一些DOM属性,比如event.target.className、event.target.tagName等之类的来判断。

<td><buttonclass="del">删除</button></td>

jQuery(function($){
//第四个表格的删除按钮事件绑定
$("#table4").click(function(e) {
if (e.target.className=="del"){
$(e.target).parents("tr").remove();
};
});
//第四个表格的添加按钮事件绑定
$("#add4").click(function(){
$("#table4>tbody").append('<tr><td>新增行</td><td><button class="del">删除</button></td></tr>')
});
});


3号解决方案——复制事件法

上面几种方案可以说即便你没有用到jQuery库,你也能相对比较容易的实现。但这种方案相对依赖jQuery的程度更高。而且必须要求jQuery 1.2版以上。低版本jQuery需要插件。
上面两个方案都是对删除函数动了很多脑筋,换了多种触发、绑定的方式。这个方案不同,可以与平时纯静态的元素一样在domready的时候绑定。但在我们添加新行的时候我们改动一下,不再想上面那样拼接字符串来添加新行了。这回我们尝试使用复制DOM元素的方式。并且复制的时候连同绑定的事件一起复制,复制完之后再用find之类的修改内部的元素。
同时,就像这个例子,如果你会把所有元素都删除光,那template这个模板是必须的,如果不会删光,那就未必需要用template了。为了防止被误删,此处我把template设了隐藏。
我使用了jQuery中特有的clone(true)

.template{display:none;}

<trclass="template">
<td>这里是模板</td>
<td><button class="del">删除</button></td>
</tr>
<tr>
<td>这行原来就有</td>
<td><button class="del">删除</button></td>
</tr>
<tr>
<td>这行原来就有</td>
<td><button class="del">删除</button></td>
</tr>

jQuery(function($){
//第五个表格的删除按钮事件绑定
$("#table5 .del").click(function() {
$(this).parents("tr").remove();
});
//第五个表格的添加按钮事件绑定
$("#add5").click(function(){
$("#table5>tbody>tr:eq(0)")
//连同事件一起复制
.clone(true)
//去除模板标记
.removeClass("template")
//修改内部元素
.find("td:eq(0)")
.text("新增行")
.end()
//插入表格
.appendTo($("#table5>tbody"))
});
});

总评:

上面4种方案,各有优劣。
0号方案,结构与行为完全没有分离,而且污染全局命名空间。最不推荐。所以我都不把它当作一个方案来看。但对于js初学者,可以用来项目救急。
1号方案,中规中矩,没啥好也没啥不好
2号方案,这种方法充分的发挥了js事件冒泡的优势。而且效率最高。但同时由于这种方案无视了jQuery强大的选择器,所以如果涉及的元素属性要求过多就会比较麻烦了。你会徘徊在众多if的条件的是非关系之中。后来我想起来,可以用jQuery中的$(event.target).is(selector)来作为条件。这样可以极大提升开发效率,但略微降低执行效率。
3号方案,这是我认为最能体现结构与行为分离的思想的一种方案。但缺点也很明显,对于jQuery依赖性过于高了,要不就自己写一个复制连同事件一起复制的函数,但这也显然对于初学者来说异常困难。但从未来的趋势的角度来看,还是很推荐使用这种方案的。

具体选用哪一个方案,没有定数。具体看你的项目以及你js还有结构与行为分离的思想的掌握程度。最适合的才是最好的。

附加:

把3号方案改造成完美的结构行为分离的样式。
首先,带有template的是模板元素。他是一切复制的源泉,为了防止被误删,所以设为不可见。如果不会删除光,那么这个模板元素也是可选的。因为你可以复制任何一个已经存在的用于循环元素。
其次,给每个重复的元素加上一个repeat,方便用于删除按钮找到这一级元素。这个是可选的,有时候并不需要。
最后是给每一个要修改的元素加上一个类,便于用find找到。比如我这里就家了content类,新增加的可以修改里边的值。
这样一个完美的结构与行为分离的案例就完成了。

<tableid="table6">
<tbody id="tbody6">
<tr class="template repeat">
<td class="content">这里是模板</td>
<td><button class="del">删除</button></td>
</tr>
<tr class="repeat">
<td class="content">这行原来就有</td>
<td><button class="del">删除</button></td>
</tr>
<tr class="repeat">
<td class="content">这行原来就有</td>
<td><button class="del">删除</button></td>
</tr>
</tbody>
<tfoot>
<tr>
<td> </td>
<td><button id="add6">添加</button></td>
</tr>
</tfoot>
</table>

jQuery(function($){
//第六个表格的删除按钮事件绑定
$("#tbody6 .del").click(function() {
$(this).parents(".repeat").remove();
});
//第六个表格的添加按钮事件绑定
$("#add6").click(function(){
$("#tbody6>.template")
//连同事件一起复制
.clone(true)
//去除模板标记
.removeClass("template")
//修改内部元素
.find(".content")
.text("新增行")
.end()
//插入表格
.appendTo($("#tbody6"))
});
});

同样,这段js也适用于如下的html结构

<ulid="tbody6">
<li class="template repeat">
<span class="content">这里是模板</span>
<span><button class="del">删除</button></span>
</li>
<li class="repeat">
<span class="content">这行原来就有</span>
<span><button class="del">删除</button></span>
</li>
<li class="repeat">
<span class="content">这行原来就有</span>
<span><button class="del">删除</button></span>
</li>
</ul>

<script type="text/javascript"></script>

展开阅读

上一篇:JS如何解决在IE下缺少标识符的错误

下一篇:如何解决jquery的flexigrid无法显示数据提示获取到数据问题

相关内容

  • 如何解决Jquery对新插入的节点 绑定Click事件失效

    下面小编就为大家带来一篇Jquery对新插入的节点 绑定Click事件失效的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    02-01Jquery对新插入的节点 绑定Click事件失效的解决方法

    阅读更多
  • jQuery实现为动态添加的元素绑定事件示例效果

    这篇文章主要介绍了jQuery实现为动态添加的元素绑定事件,结合实例形式分析了jQuery常见的事件绑定相关操作技巧与注意事项,需要的朋友可以参考下

    02-12jQuery实现为动态添加的元素绑定事件实例分析

    阅读更多
  • jQuery支持动态参数将函数绑定到事件上的实例内容

    这篇文章主要介绍了jQuery支持动态参数将函数绑定到事件上的方法,实例分析了两种支持动态参数的函数绑定技巧,需要的朋友可以参考下

    01-17jQuery支持动态参数将函数绑定到事件上的方法

    阅读更多
  • jQuery实现回车键绑定点击事件功能

    当按下回车键时,绑定按钮点击事件,本文为大家介绍下jQuery回车键绑定点击事件的具体实现

    01-17jQuery实现当按下回车键时绑定点击事件

    阅读更多
  • jQuery实战从入门到精通

    jQuery实战从入门到精通

    本书以理论与实践相结合的方式详尽讲述了 jQuery 基础、jQueryUI、jQuerMobile 相关知识和实战开发技术,适合作为jQuery 入门、jQuery Ajax、jQuery UI、jQuery Mobile 开发及案例方面的自学用书

    大小:189.1 MBjQuery

    点击下载
  • jQuery EasyUI开发指南

    jQuery EasyUI开发指南

    使用Java开发软件的开发人员一定会接触到前端开发,而前端开发有一个流行趋势,那就是插件开发。jQuery EasyUI是目前Java Web领域流行的插件开发工具。《jQuery EasyUI开发指南》主要讲述EasyUI各种

    大小:48.4 MBjQuery

    点击下载
  • jQuery api 3.3.1中文手册

    jQuery api 3.3.1中文手册

    jQuery3.3.1中文手册 是一套jQuery API 3.3.1速查表,很实用的手册,在编写jQuery查看很实用,其内包含了jquery学习过程中的各类知识点,能够让你清楚地了解每一个函数的核心内容,属性以及css框架信息,从而更好的实现编程。需要的朋友可下载试试! 使用说明 这是目前最新版的jQuery api中文文档3.3.1版本。先解压压缩包。在打开软件。如果出现空白情况。请确保IE版本在9.0以上,或者是鼠标右击文件,选择ldquo;属性rdquo;,点击ldquo;取消限制rdquo;即

    大小:1.58 MBjQuery

    点击下载
  • 疯狂前端开发讲义:jQuery+AngularJS+Bootstrap前端开发实战

    疯狂前端开发讲义:jQuery+AngularJS+Bootstrap前端开发实战

    大小:131.7 MB前端开发

    点击下载

学习笔记

38小时50分钟前回答

jQuery中对未来的元素绑定事件用bind、live or on

对未来的元素绑定事件不能用bind, 1、可以用live代替,但是要注意jquery的版本,根据官方文档,从1.7开始就不推荐live和delegate了,1.9里就去掉live了。 2、推荐用on代替(注:1.7及以上的版本才支持)。用法:on(events,[selector],[data],fn) //放在$(function(){})里才有效 $(document).on("click", "#testDiv", function(){ //此处的$(this)指$( "#testDiv"),而非$(document) }); 3、 当只想为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数时,用.one()代替on就可以了,注意不是在所有的[selector]上都可以执行一次,而是在这些[select]上总共也就执行一次,对未来的元素也有效。 4、如果某个div里有增删改三个按钮需要绑定事件,像……

40小时29分钟前回答

Jquery on方法绑定事件后执行多次的解决方法

这两天工作中遇到使用js动态加载内容,同时需要对加入的内容绑定点击事件的,当时想想了想可以使用 内联的onclick 来实现,后来没有这样做,使用的是 on(‘click',function(){}) ,然而使用on方法的时候就发现,on 对同一个元素多次绑定同一个事件的时候,这个事件就会执行多次。 下面给出这种情况的实例: $(function(){ $(".add").click(function(eve){ $(".btn-area").append("button class='test-btn'test button/button"); //$(".test-btn").off("click"); $(".test-btn").on("click",function(){ console.log("test button ....."); }); });}); 在点击add按钮的添加测试按钮,测试按钮绑定点击事件,console 台输出一句话。 执行结果如下: 很明显,第一个按钮点击之后执行……

39小时21分钟前回答

页面元素绑定jquery toggle后元素隐藏的解决方法

到今天实习已经一个多月了,公司给我布置的任务很少,哎,感觉有点不爽啊。既然这样,那我还是有事情做的,写毕业设计。言归正传,我今天在写毕业设计的时候,在给一个元素绑定jquery的toggle方法之后奇迹发生了,绑定这个方法的元素全部隐藏了。开始的时候 我怎么也没想到是这里有问题,我找了半天才发现是因为绑定了toggle方法。可是为什么绑定这个方法之后元素会隐藏呢? 其实具体原因我也不知道,我通过查找资料才得知,原来jquery在1.9版以后功能发生了变化,不在支持多个事件轮流切换了,搞了半天原来是版本的问题。因此解决办法有两个,目前想到的也就这两个办法: 1、换个稍微低点……