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

Posted websjs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新元素之前的事件绑定无效(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加载完成后执行绑定,而动态创建元素还没有出现(先有的元素还没有),自然绑定不上事件。

jq的delegate事件实现新元素的事件绑定

$(\'ul\').delegate(\'li\',\'click\',function(){
  ***
})

  

以上是关于新元素之前的事件绑定无效(live方法)--事件委托的主要内容,如果未能解决你的问题,请参考以下文章

append追加元素绑定事件无效的解决办法

JQjq动态绑定事件.on()解绑事件off()

jQuery事件绑定on()bind()live()与delegate() 方法详解

浅谈Jquery中的bind()live()delegate()on()绑定事件方式

在微信公众号开发(微站)过程中用Zepto/jquery的on/live绑定的click事件点击无效(不能执行)

给动态元素绑定事件