新元素之前的事件绑定无效(live方法)--事件委托

jq1.7之前 可以用live();绑定事件 ,动态生成的标签也可以绑定上。

jq1.7之后live(),方法取消改为on();但是动态生成的元素绑定不上事件了。

 1 <ul>
 2     <button id="btn">creatEle</button>
 3     <li class="li">1111111111</li>
 4     <li class="li">1111111111</li>
 5     <li class="li">1111111111</li>
 6     <li class="li">1111111111</li>
 7 </ul>
 8     <script type="text/javascript">
 9         $(‘#btn‘).on(‘click‘ , function(){
10             $(‘ul‘).append($(‘<li class="li">123456</li>‘))
11         })
12         $(‘.li‘).on(‘mouseover‘ ,function(){
13             $(this).css(‘background‘ , ‘#ff0‘)
14         });
15         $(‘.li‘).on(‘mouseout‘ ,function(){
16             $(this).css(‘background‘ , ‘#ccc‘)
17         });

已有元素事件绑定成功,

新创建元素事件没有绑定上。

下面介绍一种事件委托的方法,给父元素绑定事件。

 1 <ul>
 2     <button id="btn">creatEle</button>
 3     <li class="li">1111111111</li>
 4     <li class="li">1111111111</li>
 5     <li class="li">1111111111</li>
 6     <li class="li">1111111111</li>
 7 </ul>
 8     <script type="text/javascript">
 9         $(‘#btn‘).on(‘click‘ , function(){
10             $(‘ul‘).append($(‘<li class="li">123456</li>‘))
11         })
12         // $(‘.li‘).on(‘mouseover‘ ,function(){
13         //     $(this).css(‘background‘ , ‘#ff0‘)
14         // });
15         // $(‘.li‘).on(‘mouseout‘ ,function(){
16         //     $(this).css(‘background‘ , ‘#ccc‘)
17         // });
18
19         $(‘ul‘).on(‘mouseover‘ ,function(event){
20             var event=event || window.event;
21             var target=event.srcElement || event.target;
22             if(target.nodeName.toLowerCase() == ‘li‘){
23                 $(target).css(‘background‘ , ‘#ff0‘)
24             }
25         })
26         $(‘ul‘).on(‘mouseout‘ ,function(event){
27             var event=event || window.event;
28             var target=event.srcElement || event.target;
29             if(target.nodeName.toLowerCase() == ‘li‘){
30                 $(target).css(‘background‘ , ‘#ccc‘)
31             }
32         })
33     </script>

var event=event || window.event;
var target=event.srcElement || event.target;

IE与FF的兼容。

新元素也有了效果。

父元素一直是存在的,父元素的事件绑定也没问题,通过事件委托找到事件对象target元素,操作target元素。

对于li来说 是先有的事件,然后是事件找到元素。

而之前的on()事件绑定是先有的元素,然后有事件。

对于动态创建的元素来说,js加载完成后执行绑定,而动态创建元素还没有出现(先有的元素还没有),自然绑定不上事件。

时间: 2024-10-19 08:03:11

新元素之前的事件绑定无效(live方法)--事件委托的相关文章

JQuery实现click事件绑定与触发方法分析

原生JS通过什么方法绑定click事件? 原生js有一下三种方法为DOM对象绑定click事件, 第一种,在html中添加 onclick属性,在此属性中添加要绑定的事件函数,如下, 这种方法为html处理事件的原始方法,使得html和js过分耦合, 即表现层代码 和 行为层代码耦合: <html> <head> <script src="./jquery.js"></script> </head> <body>

事件绑定和阻止默认事件

5月29,30日 终于到了这一天.晚上有数据结构课,10点多的火车,我们就没有去上课,下午在宿舍里收拾东西,晚上8点左右从南校出发,9点半多到达火车站和老师学长学姐们会和. 第一次去北京,第一次买的卧铺,真的很兴奋.对这次北京之行满满的都是期待.卧铺,躺在上面很舒服,因为第一次,不知道还需要换票,就把票放在包里了,找了一会才找到,看来还是得把票随身带着.卧铺晚上熄灯,我看了一部电影,然后就睡着了,一觉睡到五点多.上午看了看模板,这次蓝桥杯决赛说实话没有怎么认真的准备,做的题也比较少.把一些小的知

原生js跨浏览事件绑定(移除)/javascript事件绑定(移除)

网上找了半天没看到,都是基于ie attachEvent(有诸多的问题存在)来写的,所以手动写了个js模拟绑定事件希望能帮到需要的童鞋 addEvent = function(obj,type,fn){  if(obj.addEventListener) {//W3C   obj.addEventListener(type,fn,false);  }else if (obj.attachEvent) {//ie(期待它的灭亡)   if(!obj.events) obj.events = {};

JS事件绑定和JQ的事件绑定的几种方式

JS事件绑定的方式: 1.内嵌法: <input type="button" onclick="test()" value="click me"/> 或者是多事件绑定:<input type="button" onclick="javascript:test();test1();" value="click me"/> 2.动态绑定 直接为对象赋值 documen

JS事件绑定和普通添加事件的区别

一个很简单的示例. 普通添加事件的方法: var btn = document.getElementById("hello"); btn.onclick = function(){ alert(1); } btn.onclick = function(){ alert(2); } 执行上面的代码只会alert 2 事件绑定方式添加事件: var btn = document.getElementById("hello"); btn.addEventListener(

JavaScript 中 onload 事件绑定多个方法的优化建议

页面加载完毕时会触发 onload 事件.基于内容(HTML)要与行为(JavaScript)分离的编码思想,我们需要将一些对页面的初始化操作写在方法内,并通过window.onload = functionName 调用这些方法.需要调用多个方法时,若使用 window.onload = functionA; window.onload = functionB;,它们之中只有最后一个方法会被实际调用.那么应如何实现调用多个方法呢? 直接在 HTML 中编写: <body > 由于事件包含在

JavaScript 中 onload 事件绑定多个方法

当需要调用的方法较多时,我们可以进一步优化,编写一个专门用于绑定 onload事件的方法: function addLoadEvent(func) { //把现有的 window.onload 事件处理函数的值存入变量 var oldOnload = window.onload; if (typeof window.onload != "function") { //如果这个处理函数还没有绑定任何函数,就像平时那样添加新函数 window.onload = func; } else {

JQUERY事件绑定方法研究

阅读前,我认为你需要先知道以下几点基础知识: dom对象是树形结构的 dom中的事件会从触发事件的目标节点开始逐级向上冒泡 每当我们想给某个元素绑定事件的时候,第一个想到的方法是bind,我们就先来说说bind. bind的作用是给具体的某个元素绑定事件,比如 1 $('button').bind('click',function(){}); 给所有的button元素添加了点击事件处理方法.这似乎已经可以完成大部分的事件绑定任务了,然而有一个问题它无法解决–如果某一元素是新添加的怎么办?bind

jquery事件绑定的几种用法

常见的事件绑定的几种方法 主要有on(),bind(),live(),delegate(),随着版本的不断更新,live(),bind(),delegate()被相继弃用.live():1.7版本之后被弃用bind().delegate():3.0版本之后被弃用虽然在3.0之后的版本中有bind和delegate在,但在具体的实现上还是调用的on() bind: function( types, data, fn ) { return this.on( types, null, data, fn