jquery live()重复绑定的解决方法介绍

Query中.live()方法的使用方法

今天在写代码的时候遇到一个问题,直接上代码看:
$(function(){
           $(".file").live("click",function(){
                    var task_name=$(this).text();
                    $("#selecting tbody").append("<trclass=gradeA'><tdclass='center'>"+task_name+"</td></tr>");     
           });  
    });

$(".file")对象是从后台传过来的,click肯定是不行的,bind()也无法获取动态添加的元素,因此只能用live(),但是使用live()遇到的问题是表格行会莫名其妙的添加了两行,即绑定事件重复执行了,纠结了一上午终于找到了原因,先看live()方法的介绍。

live(type, [data],fn)

概述

jQuery给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效。

这个方法是基本是的 .bind() 方法的一个变体。使用 .bind()时,选择器匹配的元素会附加一个事件处理函数,而以后再添加的元素则不会有。为此需要再使用一次 .bind() 才行。比如说

<body>
<div class="clickme">Clickhere</div>
<body>

可以给这个元素绑定一个简单的click事件:

$('.clickme').bind('click', function() {        
alert("Bound handler called.");     
});

当点击了元素,就会弹出一个警告框。

然后,想象一下这之后有另一个元素添加进来了。

$('body').append('<div class="clickme">Another target</div>');

尽管这个新的元素也能够匹配选择器".clickme" ,但是由于这个元素是在调用 .bind() 之后添加的,所以点击这个元素不会有任何效果。

.live()就提供了对应这种情况的方法。如果我们是这样绑定click事件的:

$('.clickme').live('click', function() {
alert("Live handler called.");      
});

然后再添加一个新元素:

$('body').append('<divclass="clickme">Anothertarget</div>');

然后再点击新增的元素,他依然能够触发事件处理函数。

事件委托

.live()方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应。

传递给 .live()的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM树的根节点上。在我们的例子中,当点击新的元素后,会依次发生下列步骤:

1、生成一个click事件传递给<div> 来处理

2、由于没有事件处理函数直接绑定在 <div>上,所以事件冒泡到DOM树上

3、事件不断冒泡一直到DOM树的根节点,默认情况下上面绑定了这个特殊的事件处理函数。

4、执行由 .live()绑定的特殊的 click 事件处理函数。

5、这个事件处理函数首先检测事件对象的 target 来确定是不是需要继续。这个测试是通过检测$(event.target).closest('.clickme') 能否找到匹配的元素来实现的。

6、如果找到了匹配的元素,那么调用原始的事件处理函数。

由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。

附加说明

.live()虽然很有用,但由于其特殊的实现方式,所以不能简单的在任何情况下替换 .bind()。主要的不同有:

在jQuery 1.4中,.live()方法支持自定义事件,也支持所有的JavaScript 事件。在jQuery 1.4.1中,甚至也支持 focus 和 blue事件了(映射到更合适,并且可以冒泡的focusin和focusout上)。

另 外,在jQuery1.4.1中,也能支持hover(映射到"mouseenter mouseleave")。然而在jQuery1.3.x中,只支持支持的JavaScript事件和自定义事件:click, dblclick, keydown, keypress,keyup, mousedown, mousemove, mouseout, mouseover, 和 mouseup.

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

当一个事件处理函数用 .live()绑定后,要停止执行其他的事件处理函数,那么这个函数必须返回 false。 仅仅调用 .stopPropagation()无法实现这个目的。

参考 .bind() 方法可以获得更多关于事件绑定的信息。

在jQuery 1.4.1中,你可以一次绑定多个事件给 .live() ,跟.bind() 提供的功能类似。

在jQuery 1.4中,data参数可以用于把附加信息传递给事件处理函数。一个很好的用处是应付由闭包导致的问题。可以参考 .bind()的讨论来获得更多信息。

参数

typeString     事件类型

data(可选)    Object          欲绑定的事件处理函数

fn                  Function        欲绑定的事件处理函数

示例

HTML 代码:

<p>Clickme!</p>

jQuery 代码:
$("p").live("click", function(){
$(this).after("<p>Anotherparagraph!</p>");
});

描述:

阻止默认事件行为和事件冒泡,返回false

jQuery 代码:
$("a").live("click",function() { return false; });

//根本原因在这,需要阻止默认事件行为和事件冒泡,在代码后面添加return false;就OK了

描述:

仅仅阻止默认事件行为

jQuery 代码:
$("a").live("click", function(event){
event.preventDefault();
});

(0)

相关推荐

  • 浅析jquery某一元素重复绑定的问题

    某天晚上写代码的时候,突然出了bug,想了很久都不知道问题出在哪里(其实是很简单的问题,但由于我还是个菜鸟,所以不知道).几经周折,这中间的过程就不提了,终于让我在快崩溃的时候,发现了原因.原来是因为同一jquery元素可以重复绑定,当使用了嵌套绑定的时候,就容易出错.如代码: 复制代码 代码如下: $('.test').bind('click',function(){      $('.last').bind('click',function(){           alert('nihao

  • jquery绑定事件不生效的解决方法

    今天在开发前台页面时发现jquery绑定click事件,怎么都不生效.代码如下: 1.html:<input id="ceshisub" type="button" value="单击事件" > 2.html引用的test.js中的方法函数: 复制代码 代码如下: $("#ceshisub").bind("click",function(){ var a=1; a +=1; alert(&quo

  • jQuery中live方法的重复绑定说明

    解决:使用die()方法,在live()方法绑定前,将此元素上的前面被绑定的事件统统解除,然后再通过live()方法绑定新的事件. 复制代码 代码如下: //先通过die()方法解除,再通过live()绑定 $("#selectAll").die().live("click",function(){ //事件运行代码 }); die()方法简介: 复制代码 代码如下: die([type], [fn])<SPAN style="WHITE-SPACE

  • JQuery给元素绑定click事件多次执行的解决方法

    原绑定方法: 复制代码 代码如下: $("#sdfsd").on("mouseout",function(e){ ***** }); 这种方法只会在原click方法中继续添加新方法: 解决办法更改绑定方法为: 复制代码 代码如下: $("#sdfsd").unbind("click").click(function(e){ ***** }); 在绑定新click方法前对元素所绑定的click方法解绑

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

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

  • jQuery中的bind绑定事件与文本框改变事件的临时解决方法

    一直没什么兴趣看jQuery,就用自己那点不咋样的javascript硬撑着,今天写一个功能时想尝试一下,用bind注册事件时发现怎么都不好使 复制代码 代码如下: $("#txtStation").bind("onpropertychange", GetStationLevel); 然后onclick之类的都试了,没一个能用的,无奈去翻jQuery的API,都是鸟语我也看不懂具体说了点了,但是发现bind注册事件都是没有on的. 发现有change事件,试了试 复

  • JQuery 给元素绑定click事件多次执行的解决方法

    原绑定方法: $("#sdfsd").on("click",function(e){ ***** }); 这种方法只会在原click方法中继续添加新方法: 解决办法更改绑定方法为: $("#sdfsd").unbind("click").click(function(e){ ***** }); 在绑定新click方法前对元素所绑定的click方法解绑

  • jquery事件重复绑定的快速解决方法

    一 $.fn.live 重复绑定 解决:使用die()方法,在live()方法绑定前,将此元素上的前面被绑定的事件统统解除,然后再通过live()方法绑定新的事件. 复制代码 代码如下: //先通过die()方法解除,再通过live()绑定$("#selectAll").die().live("click",function(){//事件运行代码}); 二 click等事件 解决:使用unbind("click")方法先解除绑定的事件再绑定新事件

  • jQuery防止重复绑定事件的解决方法

    本文实例分析了jQuery防止重复绑定事件的解决方法.分享给大家供大家参考,具体如下: 一.问题: 今天发现jQuery一个对象的事件可以重复绑定多次,当事件触发的时候会引起代码多遍执行. 下面是一个click事件被重复绑定的示例: function reg_button_click(){ $("#button).click(function(){ alert("button click"); }); } $(document).ready(function(){ #重复注册

  • jquery live()重复绑定的解决方法介绍

    Query中.live()方法的使用方法 今天在写代码的时候遇到一个问题,直接上代码看:$(function(){           $(".file").live("click",function(){                    var task_name=$(this).text();                    $("#selecting tbody").append("<trclass=gradeA

  • iOS11 SectionHeader 胡乱移动且滑动时出现重复内容的解决方法

    升级到iOS 11后,痛苦的事情多起来了,以前版本没有的出现问题的代码,经过Xcode 9一编译,千万草泥马奔腾而过: 今天碰到一个奇葩问题,直接进入主题: 问题描述: -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 12; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderIn

  • js学习总结之DOM2兼容处理重复问题的解决方法

    DOM2兼容处理重复问题的解决方法,具体如下 在解决this问题之后,只需要在每次往自定义属性和事件池当中添加事件的时候进行一下判断就好了,具体代码如下 /* bind:处理DOM2级事件绑定的兼容性问题(绑定方法) @parameter: curEle->要绑定事件的元素 evenType->要绑定的事件类型("click","mouseover") evenFn->要绑定的方法 */ function bind(curEle,evenType,

  • MySQL 处理插入过程中的主键唯一键重复值的解决方法

    本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IGNORE 使用ignore当插入的值遇到主键(PRIMARY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的记录行,不影响后面的记录行的插入, 创建测试表 CREATE TABLE Tignore (ID INT NOT NULL PRIMARY KEY , NAME1 INT )d

  • PHP+Session防止表单重复提交的解决方法

     index.php 当前表单页面is_submit设为0 SESSION_START(); $_SESSION['is_submit'] = 0; <form id="reg" action="post.php" method="post"> <p>用户名:<input type="text" class="input" name="username" i

  • android真机调试时无法显示logcat信息的解决方法介绍

    android真机调试时无法显示logcat信息的解决方法介绍: window-->show view-->android->devices, 打开devices,点击右边的截屏图片的按钮.等到出现截图的时候,logcat就出来信息了!

  • 引用jquery框架后出错的解决方法

    问题描述:当引用了jquery框架后,页面的js不能正常工作. 后面我的解决办法:是因为在引用 jquery的框架时的代码为 <script type="text/javascript" src="resources/js/jquery/jquery-1.9.1.min.js" />  改为如下的引用方式 <script type="text/javascript" src="resources/js/jquery/j

  • 基于多进程中APScheduler重复运行的解决方法

    问题 在一个python web应用中需要定时执行一些任务,所以用了APScheduler这个库.又因为是用flask这个web框架,所以用了flask-apscheduler这个插件(本质上与直接用APScheduler一样,这里不作区分). 在开发中直接测试运行是没有问题的,但是用gunicorn部署以后发生了重复运行的问题: 每个任务在时间到的时刻会同时执行好几遍. 注意了一下重复的数量,恰恰是gunicorn里配置的worker进程数量,显然是每个worker进程都启动了一份schedu

  • jquery 插件重新绑定的处理方法分析

    本文实例讲述了jquery 插件重新绑定的处理方法.分享给大家供大家参考,具体如下: 比如有一个slide的jquery插件,页面打开就对dom进行了绑定. <div class="expert"> <div class="expert-list"> <ul> <li class="expert-item"> <a href="#" rel="external n

随机推荐