JQ动态生成节点绑定事件无效问题

Wesley13
• 阅读 700

最近做项目的时候遇见了一个问题,通过jq将动态节点绑定到dom节点上,并且为动态节点绑定方法,此方法再次为动态节点添加动态节点,但在刷新之后,动态节点上的方法失效了,过程为:创建动态节点->动态节点绑定方法->添加动态节点->刷新后点击动态节点方法失效。

  

  

1、首先通过ajax获取到管理员管理多少个班级
-------------------
| 班级1            |
-------------------
| 班级2            |
-------------------
|                      |
|                      |
|                      |
|                      |
|                      |
|                      |
-------------------

...ajax
success: function (res) {
  for (i = 0; i < res.data.length; i++) {
    var collegeList = '

    ' +
                  '
  • ' +
                    '' + res.data[i].FullName + '' +
                    '
    ' +

                    '

    '
                  '
  • ' +
                '
';
  $("#liData").append(collegeList);
}
......

2、点击对应班级添加班级学生
--------------------
| 班级1(active) |
--------------------
| 学生1        |
| 学生2        |
| 学生3             |
| 学生4             |
| 学生...            |
-------------------
| 班级2             |
|           |
--------------------

Function getPro(id){
...ajax
success: function (ress) {
  for (j = 0; j < ress.data.length; j++) {
    var list = '

  • ' +
              '' +
                '

    姓名:' + ress.data[j].StudentName + '

    ' +
                '

    学号:' + ress.data[j].StudentID + '

    ' +
                '

    性别:' + ress.data[j].Sex + '

    ' +
                '

    院系:' + ress.data[j].College + '

    ' +
                '

    专业:' + ress.data[j].ProfessionalName + '

    ' +
                '

    班级:' + ress.data[j].OrganName + '

    ' +
              '
    ' +
            '
  • ';
      $("#" + id+ "").append(list);
      }
    }
    }
    ......

    3、刷新后会发现,点击班级加载不出学生来,于是采用同步加载的方式勉强实现

    ...ajax
    success: function (res) {
      for (i = 0; i < res.data.length; i++) {
        var OrganID = res.data[i].ID;
        var collegeList = '

      ' +
                    '
    • ' +
                      '' + res.data[i].FullName + '' +
                      '
      ' +

                      '

      '
                    '
    • ' +
                  '
    ';
        $("#liData").append(collegeList);
        $.ajax({
          ......
          async: false,//同步,但并非好办法
          success: function (ress) {
            for (j = 0; j < ress.data.length; j++) {
              var list = '
  • ' +
                    '' +
                      '

    姓名:' + ress.data[j].StudentName + '

    ' +
                      '

    学号:' + ress.data[j].StudentID + '

    ' +
                      '

    性别:' + ress.data[j].Sex + '

    ' +
                      '

    院系:' + ress.data[j].College + '

    ' +
                      '

    专业:' + ress.data[j].ProfessionalName + '

    ' +
                      '

    班级:' + ress.data[j].OrganName + '

    ' +
                    '
    ' +
                  '
  • ';
            $("#" + OrganID + "").append(list);
            }
          }
        })
      }
    }

    4、网上找了很多解决方案,学习了委托,其作用在于
    1)提高性能
      对于多个相同的操作,如果足一操作,会影响性能
    2)重复事件
      新添加了元素还要触发之前的事件,而之前事件已经执行完,导致不再触发(我的错误就属于此类)
      $("...").click(function(){
        let list='';
        $("...").append(list);
      })

      $("btn").click(function(){
      //方法无效
      })

      $("父节点").on('click','button',function(){
        //通过事件委托完成,有效
      })

    ps:当时很想明白我犯的错误的原理,但网上全是例子,没有详细说明原因,很是苦恼,最后找到一个讲解比较详细还很通俗易懂的帖子,分享给大家:
    https://blog.csdn.net/a\_csdner/article/details/76164986

    小结:
    $('...').bind('click',function(){
      //这就是事件不委托,每个按钮有自己的事件
    })
    $('#btn').delegate('.button','click',function(){
      //这就是事件委托,
    })
    $('#btn').undelegate('.button','click')//取消绑定

    点赞
    收藏
    评论区
    推荐文章
    待兔 待兔
    3个月前
    手写Java HashMap源码
    HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
    Easter79 Easter79
    3年前
    tidb损坏tikv节点怎么恢复集群
    tikv节点宕机(机器再起不来),或者数据节点被rmrf 掉了怎么办正常情况下tikv节点down掉了。此时不要去执行store delete store\_id。数据一般可以正常访问,但是如果永久损坏的tikv节点。我们总想要把它移除。如何移除呢? (移除kv节点过程中,如果kv节点健康在线,可以实现动态移除。如果kv节点不可用,可能导致访
    菜园前端 菜园前端
    1年前
    DOM 文档对象模型使用教程来喽!
    原文链接:HTML模板html我是网站标题访问节点通过id访问指定节点getElementByIdjavascriptvarnodedocument.getElementById('box')通过name访问指定节点getElementsByNamejav
    Wesley13 Wesley13
    3年前
    GoJS API学习
    varnode{};node"key""节点Key";node"loc""00";//节点坐标node"text""节点名称";//添加节点通过按钮点击,添加新的节点到画布myDiagram.model.addNodeData(nod
    Stella981 Stella981
    3年前
    Redis系列
    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。可喜的是Redis从2.8开始正式提供了RedisSentinel(哨兵)架构来解决这个问题。总结:Redis主从复制的缺点:没有办法对master进行动态
    Stella981 Stella981
    3年前
    ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID
    使用elementui tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys后,发现只能返回子节点的ID,但是其父节点ID没有返回。解决办法有三种:1.elementui有一个获取半选择状态值ID得方法  getHalfCheckedKeys  这个方法用来获取父节点半选择状态ID值2.修改源码  找到
    Stella981 Stella981
    3年前
    DMV.P.N学习总结
    动态多点V.P.N集成了动态_的动态简化多线_配置和GREoverIPSEC的多协议tunnel传输功能,形成了HUBSPOKER的网络架构模式,既可以实现中心节点一次配置零调整,分支节点无限制接入,又能实现动态协议的部署。DMV.P.N只能部署在Cisco的路由器上,同时还需要注意版本支持。实现DMV.P.N功能的四大技术组件分
    Stella981 Stella981
    3年前
    RabbitMQ分布式集群架构和高可用性(HA)
    (一)功能和原理设计集群的目的允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行通过增加更多的节点来扩展消息通信的吞吐量1集群配置方式RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovelcluster:不支持跨网段,用于同一个网段内的局域网可以随意的动态增加或者减
    Stella981 Stella981
    3年前
    D3.js力导向图中新增节点及新增关系连线示例
    大家在使用D3.js中的力导向图时,基本都会遇到动态增加节点及连线的需求,这里记录一下我的实现方式。话不多说,先放代码:<!DOCTYPEhtml<htmllang"en"<head<metacharset"UTF8"<titleTitle</tit
    Stella981 Stella981
    3年前
    CocosCreator 代码组件(创建销毁节点、访问节点和组件) (第四篇)
    前言:在游戏开发中,我么都是通过代码来控制场景中的节点,下面讲解怎么用代码,创建节点、销毁节点、访问节点、访问组件。一、创建和销毁节点1\.创建新节点除了通过场景编辑器创建节点外,我们也可以在脚本中动态创建节点。通过newcc.Node()并将它加