前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JQuery 事件绑定不生效

JQuery 事件绑定不生效

作者头像
用户3158888
发布2019-05-29 17:23:09
2.6K0
发布2019-05-29 17:23:09
举报
文章被收录于专栏:计算机图形学 前端可视化 WebGL

一个同时问我,JQuery事件绑定为什么不生效,最好通过查找,发现了问题。 一般而言,JQuery事件绑定不生效,是一些新手经常遇到的问题,其实都是简单的问题,大概分两种情况。 先上代码,以下两个button的事件绑定都不生效。

代码语言:javascript
复制
<html>
<head>
  <script src="../libs/jquery.js"></script>
  <script type="text/javascript">
      $("#button1").click(function () {
          alert("button1 clicked");
      });

      $(function(){
          var div = $("<div><button id = 'button2'>button2</button></div>");
          var body = $(document.body);
          body.append(div);
          div.find("#button2").click(function () {
               alert("button2 clicked");
            });
          div.remove();
          body.append(div);    
         })
      
  </script>
</head>
<body>
<div>
  <button id = "button1">button1</button>
</div>
</body>
</html>

下面讲述原理:

绑定事件在未加载完成之前

首先看button1的事件绑定,

代码语言:javascript
复制
$("#button1").click(function () {
          alert("button1 clicked");
      });

button1在未加载完成之前,通过$("#button1").click方法来进行事件绑定,由于此时未加载完成,实际上$("#button1")是一个空数组,所以最终的结果是未对任何元素进行事件绑定。 那么如何解决这个问题呢,其实这个问题本不应该发生,一般新手比较容易出问题,解决的方式很简单,把事件绑定放在加载完成之后,JQuery的做法是:

代码语言:javascript
复制
$(function(){
$("#button1").click(function () {
          alert("button1 clicked");
      });
})

绑定事件后移除了元素重新加入

再看button2,button2首先通过JQuery 的方法被创建出来,然后被加入到body中,然后绑定事件,之后从body中移除,然后在加入body中:

代码语言:javascript
复制
var div = $("<div><button id = 'button2'>button2</button></div>");
          var body = $(document.body);
          body.append(div);
          div.find("#button2").click(function () {
               alert("button2 clicked");
            });
          div.remove();
          body.append(div);    
         })

此时点击也不会生效,这是因为,在从文档中移除的时候,JQuery 会自动把绑定的事件移除掉了,然后在加入的时候,事件绑定已经不存在了;这种情况应该如何解决呢? 一般来说,如果某些元素存在频繁的添加 移除 在添加的操作,可以考虑delegate的方式,比如:

代码语言:javascript
复制
 var div = $("<div><button id = 'button2'>button2</button></div>");
          var body = $(document.body);
          body.delegate('#button2','click',function(){
              alert("button2 clicked");
          });
          body.append(div);
          // div.find("#button2").click(function () {
          //      alert("button2 clicked");
       //      });
          div.remove();
          body.append(div);    

总结

最终正确的代码如下:

代码语言:javascript
复制
<html>
<head>
 <script src="../libs/jquery.js"></script>
 <script type="text/javascript">
     $(function(){
        $("#button1").click(function () {
         alert("button1 clicked");
          });
         var div = $("<div><button id = 'button2'>button2</button></div>");
         var body = $(document.body);
         body.delegate('#button2','click',function(){
             alert("button2 clicked");
         });
         body.append(div);
         div.remove();
         body.append(div);    
        })
     
 </script>
</head>
<body>
<div>
 <button id = "button1">button1</button>
</div>
</body>
</html>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 绑定事件在未加载完成之前
  • 绑定事件后移除了元素重新加入
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档