关于动态生成dom绑定事件失效的原因及解决和live()

动态生成DOM不会触发点击事件原因解决方法 为了解决这个问题,我们可以使用事件委托的方式将点击事件绑定到父元素上,并在事件处理程序中检查事件目标是否匹配我们期望的子元素。然而,如果在事件绑定之后动态生成新的DOM元素,并且没有为这些新元素单独绑定事件处理程序,那么它们就无法触发点击事件动态生成DOM元素无法触发点击事件的主要原因事件委托的机制。通过使用事件委托,我们可以确保动态生成DOM元素也能够触发点击事件,而无需为每个元素单独绑定事件处理程序。要解决动态生成DOM无法触发点击事件的问题,我们可以使用事件委托的方式来处理。 阅读详情

在测试给动态生成的dom绑定事件的时候发现事件失效,于是就测试了一下:

1. 事件失效的原因:

(1)bind事件绑定只对dom中存在的元素有效,对于我们后来动态增加的元素是监测不到,所以绑定不了

(2)同样,当你使用var aa = document.getElementsByTagName("动态生成的元素");来获取动态生成的元素的时候也是获取不到的,因为网页只会执行一次初始化绑定,之后动态生成的dom元素也是监测不到的。

2. 解决办法:

(1)在每一个动态生成的地方都再绑定多一次事件,比如这个博客里面的例子

(2)把bind改用live,因为live是实时监测的,对于新增的dom元素也是有效的(因为不断去绑定、判断,所以可能会影响Web性能问题)

(3)把bind改用delegate,因为delegate是实时监测的。

(4)在jquery1.7 起版本用on替代了bind()、live() 和 delegate() 方法。

3. 关于最近遇到的事件失效的原因:在原本的网页中(代码可见https://github.com/UFOwl/ife/tree/master/stage02/task16),我想要获取table里面动态生成的删除按钮,帮删除按钮绑定删除时间,可是删除事件失效,因为删除按钮是动态生成的,初始化事件绑定的时候,获取到的table里面的button已经是空的,所以绑定的一直都是空元素,所以点击button按钮的时候一直没有反应。

4. 最后的解决办法:先获取table,然后再绑定table的click事件(因为table是在原本已经存在的dom元素),然后当点击事件触发的时候再捕获事件的target(比如点击table里面的button,这个时候因为已经动态生成button并append进去table里面了,所以button是存在的,此时target指的是button),然后再进行相应的操作。

注意:在这里注意两个问题:

(1)table里面的元素是已经添加进入table里面了的,所以点击那个button的时候,e.target获取到的就是button

(2)为什么已经将button这些元素添加进入table里面,可是还是没能获取到呢,因为是init()这个函数初始化的时候获取table里面的button,可是此时还未进行任何操作,所以获取到的就是空,所以没绑定任何元素。

上面需要注意的两个问题要分清楚,这个是问题的关键。

5.关于bind:每次绑定事件之后事件会一直绑定着,除非用unbind解绑之后再重新绑定,要不然事件会一直存在,所以这就是为什么在做项目的时候,有时候ajax请求的结果会出现1,2,4,8这样叠加,是因为如果用了bind,每次触发事件都会绑定一次操作,所以触发第一次的时候,ajax请求一次;第二次的时候,ajax请求1+1=2次;第三次就是1+2+1=4次;第四次就是1+2+4+1=8次,以此类推。所以如果利用bind绑定事件的话,要先unbind解绑元素原本有的事件再绑定事件,才不会导致ajax请求多次。

以上这篇关于动态生成dom绑定事件失效的原因及解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

live()函数用于为指定元素的一个或多个事件绑定事件处理函数

此外,你还可以额外传递给事件处理函数一些所需的数据。

即使是执行live()函数之后新添加的元素,只要它匹配当前jQuery对象的选择器,绑定的事件处理函数仍然对其有效。

此外,可以为同一元素、同一事件类型绑定多个事件处理函数。触发事件时,jQuery会按照绑定的先后顺序依次执行绑定的事件处理函数。

要删除通过live()绑定的事件,请使用die()函数。

从jQuery 1.7开始,该函数被标记为已过时;从jQuery 1.9开始被移除。请使用on()函数来替代。即使在1.7版本之前,也强烈不推荐使用该函数。如果能够不使用该函数,就不要使用。

该函数属于jQuery对象(实例)。

语法

jQuery 1.3 新增该函数,从jQuery 1.7开始被标记为已过时,在jQuery 1.9被移除。其主要有以下两种形式的用法:

用法一:jQuery 1.4 新增支持参数data

jQueryObject.live( events [, data ], handler )

用法二:jQuery 1.4.3 新增支持该用法。

jQueryObject.live( eventsMap )

参数

参数描述
eventsString类型一个或多个用空格分隔的事件类型和可选的命名空间,例如"click"、"focus click"、"keydown.myPlugin"。
data可选/任意类型触发事件时,需要通过event.data传递给事件处理函数的任意数据。
handlerFunctilive类型指定的事件处理函数。
eventsMapObject类型一个Object对象,其每个属性对应事件类型和可选的命名空间(参数events),属性值对应绑定的事件处理函数(参数handler)。

关于参数events中可选的命名空间(1.4.3+才支持),请参考最下面的示例代码。

参数handler中的this指向当前DOM元素。live()还会为handler传入一个参数:表示当前事件的Event对象

参数handler的返回值与DOM原生事件的处理函数返回值作用一致。例如"submit"(表单提交)事件的事件处理函数返回false,可以阻止表单的提交。

如果事件处理函数handler仅仅只用于返回false值,可以直接将handler设为false

返回值

live()函数的返回值为jQuery类型,返回当前jQuery对象本身。

重要说明

live()函数并不是直接在当前jQuery对象匹配的每个元素上绑定事件处理函数,而是将事件处理函数"委托"给document对象来处理。由于DOM 2级的事件流机制,当事件触发时,该事件会在事件冒泡中传递给其所有的祖辈元素,一直传递到document对象为止。当事件流传递到document时,jQuery会判断当前匹配元素是否符合触发条件,如果该元素符合当前jQuery对象的选择器,jQuery就会捕获该事件,从而执行绑定的事件处理函数。

使用live()函数需要注意以下问题:

  • 当前jQuery对象必须通过选择器字符串构造,否则无法处理触发的事件。
  • 在调用该函数之前,jQuery会尝试查找当前jQuery选择器所匹配的元素。在大文档中这可能比较耗时。
  • 该函数不支持方法链。例如:$("a").find(".foo").live(...)是无效的,且无法按照预期正常工作。
  • 由于live()的事件处理函数全部附加到document对象上,因此在事件被处理之前,事件可能要经过最长最慢的事件路径。
  • 在由于平台或事件差异,有些事件不支持冒泡,从而无法冒泡传递到document,此时可能无法处理该事件。
  • 由于live()函数的事件处理函数全部附加在document对象上,如果通过某些方式解除了document对象上的事件绑定,可能会波及到使用live()函数委托绑定的其他元素的事件处理函数。例如$(document).off()

示例&说明

以点击事件("click")为例,以下是jQuery中事件函数的常规用法(某些函数也存在其它形式的用法,此处暂不列出):

// 这里的选择器selector用于指定可以触发事件的元素
// 这里的选择器ancestor应是selector的祖辈元素,selector触发的事件可以被其祖辈元素在事件流中捕获,从而以"代理"的形式触发事件。

// jQuery 1.0+ (1.4.3+支持参数data)
$("selector").click( [ data ,] handler );

// jQuery 1.0+ (1.4.3+支持参数data)
$("selector").bind( "click" [, data ], handler );

// jQuery 1.3+ (1.4+支持参数data)
$("selector").live( "click" [, data ], handler );

// jQuery 1.4.2+
$("ancestor").delegate( "selector", "click" [, data ], handler );

// jQuery 1.7+
$("ancestor").on( "click", "selector" [, data ], handler );

请参考下面这段初始HTML代码:

<div id="n1">
    <p id="n2"><span>CodePlayer</span></p>
    <p id="n3"><span>专注于编程开发技术分享</span></p>
    <em id="n4">http://www.365mini.com</em>
</div>
<p id="n5">Google</p>

我们为<div>中的所有<p>元素绑定点击事件:

//为div中的所有p元素的click事件绑定事件处理函数
//只有n2、n3可以触发该事件
$("div p").live("click", function(){
// 这里的this指向触发点击事件的p元素(Element)
    alert( $(this).text() );
});

运行代码(以下其他代码请自行复制到演示页面运行)

此外,我们还可以同时绑定多个事件,并为事件处理函数传递一些附加的数据,我们可以通过jQuery为事件处理函数传入的参数event(Event事件对象)来进行处理:

var obj = { id: 5, name: "王五" };

//为n5绑定mouseenter mouseleave两个事件,并为其传入附加数据obj
// 附加数据可以是任意类型
$("#n5").live("mouseenter mouseleave", obj, function(event){
    var $me = $(this);
    var obj = event.data; // 这就是传入的附加数据
    if( event.type == "mouseenter"){
        $me.html( "你好," + obj.name + "!");
    }else if(event.type == "mouseleave" ){
        $me.html( "再见," + obj.name + "!");      
    }           
} );

此外,即使符合条件的元素是live()函数执行后新添加,绑定事件对其依然有效。同样以初始HTML代码为例,我们可以编写如下jQuery代码:

//为div中的所有p元素的click事件绑定事件处理函数
//只有n2、n3可以触发该事件
$("div p").live("click", function(event){
    alert( $(this).text() );
});

//后添加的n6也可以触发上述click事件,因为它也是div中的p元素
$("#n1").append('<p id="n6">上述绑定的click事件对此元素也生效!</p>');

参数events还支持为事件类型附加额外的命名空间。当为同一元素绑定多个相同类型的事件处理函数时。使用命名空间,可以在触发事件、移除事件时限定触发或移除的范围。

function clickHandler(event){
    alert( "触发时的命名空间:[" + event.namespace + "]");
}

var $p = $("p");

// A:为所有p元素绑定click事件,定义在foo和bar两个命名空间下
$p.live( "click.foo.bar", clickHandler );

// B:为所有p元素绑定click事件,定义在test命名空间下
$p.live( "click.test", clickHandler );

var $n2 = $("#n2");

// 触发所有click事件
$n2.trigger("click"); // 触发A和B (event.namespace = "")

// 触发定义在foo命名空间下的click事件
$n2.trigger("click.foo"); // 触发A (event.namespace = "foo")
// 触发定义在bar命名空间下的click事件
$n2.trigger("click.bar"); // 触发A (event.namespace = "bar")
// 触发同时定义在foo和bar两个命名空间下的click事件
$n2.trigger("click.foo.bar"); // 触发A (event.namespace = "bar.foo")

// 触发定义在test命名空间下的click事件
$n2.trigger("click.test"); // 触发B (event.namespace = "test")

live()函数的参数eventsMap是一个对象,可以"属性-值"的方式指定多个"事件类型-处理函数"。对应的示例代码如下:

var eventsMap = {
    "mouseenter": function(event){
        $(this).html( "你好!");       
    },
    
    "mouseleave": function(event){
        $(this).html( "再见!");
    }
};

//为n5绑定mouseenter mouseleave两个事件
$("#n5").live( eventsMap );


js 给动态生成DOM绑定事件 web前端的朋友们,经常会遇到给由后台返回的数据遍历生成的DOM绑定事件,但是总是绑定不上,那是因为把事件直接绑定到了动态生成DOM上了,正确的方式是利用事件冒泡给其父元素绑定,这样才能解决问题的哦! 立即下载

相关推荐

关于动态生成dom绑定事件失效原因解决方法

之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成dom绑定事件的时候发现事件失效,于是就测试了一下: 1. 事件失效原因: (1)bind事件绑定只对dom中存在的元素有效,对于我们后来动态增加的元素是监测不到,所以绑定不了 (2)同样,当你使用var aa = document.getElementsByTagName(“动态生成的元素”);来获取动态生成的元素的时候也是获取不到的,因为网页只会执行一次初始化绑定,之后动态生成dom元素也是监测不到的。 2. 解决办法: (1)在每

通过js添加的DOM节点的click事件绑定不上的解决方案以及IOS下click事件委派失效解决方案...

问题描述: 如以下代码所示,通过js添加的Dom节点,在其上绑定点击事件,有的时候会出现点击事件不响应的情况,按照正常的理解,js代码具有阻塞性,Dom节点添加成功之后,就可以找到该节点并绑定事件,没有道理会出现事件绑定不上的问题,但是这种情况的确是遇到了多次,问题原因有待日后深入理解,下面记载一下问题的解决方案。 解决方案: 方案一:将事件绑定直接写在行内标签上"<thead onc...

weixin_30505751的博客 332

dom绑定click事件无效及解决办法

dom绑定click事件无效

肉饼弟弟 1229

蒙层阻止点击事件问题

今天在项目中遇到这样一个问题: 单击图片,出现蒙层,再次点击,蒙层消失,问题是 当蒙层出现时,无法点击图片 解决方案: 一行css代码 pointer-events: none; /** 阻止用户的点击动作产生任何效果 阻止缺省鼠标指针的显示 阻止CSS里的hoveractive状态的变化触发事件 阻止JavaScript点击动作触发的事件 **/ ...

qq_45594237的博客 1636

关于vue的动态添加dom节点及样式不生效问题的解决办法

属性,那么样式只会应用到当前组件的作用域内,而不会影响其他组件或全局样式。时,新添加的HTML内容中的类名无法生效,因为样式作用域被限制在组件内部。在Vue中,如果你的样式标签中包含。指令将HTML内容渲染到元素中。2.类名不生效问题解决

weixin_40243502的博客 3136

动态生成dom为什么绑定事件失效,以及如何解决

之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成dom绑定事件的时候发现事件失效,于是就测试了一下: 1. 事件失效原因: (1)bind事件绑定只对dom中存在的元素有效,对于我们后来动态增加的元素是监测不到,所以绑定不了 (2)同样,当你使用var aa = document.getElementsByTagName("动态生成的元素");来获取动态生成的元素的时候也是获取不到的,因为网页

Y0admin的博客 1347

动态生成dom元素时,jquery点击事件失效

这周在工作中遇到一些小问题,趁着不加班,来记录一下,好记性不如Mac键盘,啊哈哈先吟一句诗。 问题 页面上一些元素是通过js动态生成的,给这些元素绑定一些事件,比如点击,并不会生效,这是为什么呢? 解决方法 先说解决方法。 //监听新增DOM元素的点击事件 $('#domId').on('click','.newClass',function(){ //doSomething; }) //此...

团长的博客 2071

动态生成html点击事件无效,动态生成DOM不会触发onclick事件原因解决方法...

最近朋友在做一个项目的时候,遇到动态加载微博内容,然后点击“展开评论”后获取该微博的所有评论。这里使用了动态加载的点击加载评论。然后再写$(“.get_comment).click(function(){//响应事件逻辑})发现click事件并不会触发,使用控制台侦听也木有错误。百思不得其解时,因为我在以前做搜狐家居商城的运费管理时,也曾遇到,因此将焦点落在动态加载上。记得当时本人用的是行内事件,...

weixin_27017211的博客 1090

完美的jquery事件绑定方法on()

在讲on()方法之前,我们先讲讲在on()方法出现前的那些事件绑定方法: .live() jQuery 1.3新增的live()方法,用法如下: $("#info_table td").live("click",function(){/*显示更多信息*/}); 这里的.live()方法会把click事件绑定到$(document)对象,而且只需要给$(documen

Edward的web前端修炼之路 2538

jquery 事件失效以及解决方法

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

weixin_34357267的博客 815

live事件在部分手机中失效解决方案

在开发过程中难免会到弹窗,弹窗之后的按钮又会执行一些事件方法。开发的场景如下: 蓝色弹窗是事件中追加的,在追加的元素中有一个“确认捐赠”按钮,在这里执行事件方法,如果直接写在元素上绑定事件是没有问题,...

zzz19的博客 492

Jquery使用on()绑定事件失效处理

一、参考网址JQ的绑定方法参考:http://www.cnblogs.com/xilipu31/p/4105794.html on()绑定事件失效:http://www.oschina.net/question/877598_2138986二、ON()事件浅析 在高版本之后,jquery1.7版本出现之后用于替代bind()live()绑定事件方式; 用法是一样一样的。 他的作用:使用

DH2Y的全栈修仙路 2765

动态生成DOM不会触发onclick事件原因解决方法

最近朋友在做一个项目的时候,遇到动态加载微博内容,然后点击“展开评论”后获取该微博的所有评论。这里使用了动态加载的<span mid='123456789′ class='get_comment'>点击加载评论</span>。 然后再写 $(“.get_comment).click(function(){ //响应事件逻辑 }) 发现cl...

weixin_30663391的博客 684

动态生成的html 点击事件失效原因

为什么80%的码农都做不了架构师?>>> ...

weixin_34403693的博客 729

jquery live() delegate() on() 事件委托的一些区别

帮助大家理解live()、on()、delegate()的区别使用

BettyGuo2017的博客 692

关于jquery append() 加入的元素,绑定事件无效的方法

关于jquery append() 加入的元素,绑定事件无效的方法问题是:博主在撰写前端代码的时候,想要实现一个动态增加行数的表单,经过查找一番资料后,用的jquery 中的append方法实现,在原form中,是绑定了一个hover事件,发现通过append追加的form表单,hover失效了,没有了鼠标悬浮的效果,但原form仍然有这个效果。通过网上查找一番资料,不仅仅是hover存在这种问题,

a921159963的博客 4676

解决使用ajax请求 局部刷新页面后 绑定HTML标签的事件失效

解决使用ajax请求 局部刷新页面后 绑定HTML标签的事件失效 绑定事件为什么会失效? 缘由: 当你直接将事件绑定在指定的dom元素后 js已经执行完毕 事件绑定完了 这个时候 绑定事件是可以正常执行的 但是 当你使用ajax刷新了你绑定的那个dom元素 所在的区域 这个时候 是没有任何绑定事件解决方法 可以使用事件委托 语法: $(委托对象ID/class).on('绑定事件','触发对象ID/class',function(evt){ var host = $(evt.targe

Inmaturity_7的博客 602
上一篇: Java中使用Jedis操作Redis
下一篇: js格式化格林威治时间
han_ying_ying
博客等级 码龄12年 59粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值