首先先解释一下什么是动态生成的元素:动态生成的元素即我们用jquery的内部插入函数append()所生成的html代码。相对的也有静态生成的元素:即直接编写在页面的html代码。

下面通过例子来讲解:

html中有这样一个table:

 1 <div class="table-responsive">
2 <table class="table table-bordered">
3 <thead>
4 <tr>
5 <th width="30">#</th>
6 <th width="30"><input type="checkbox"></th>
7 <th>名称</th>
8 <th width="100">操作</th>
9 </tr>
10 </thead>
11 <tbody id="rolePageBody">
12 </tbody>
13 <tfoot>
14 <tr>
15 <td colspan="6" align="center">
16 <div id="Pagination" class="pagination"><!-- 这里显示分页 --></div>
17 </td>
18 </tr>
19
20 </tfoot>
21 </table>
22 </div>

这是一个JavaScript函数:作用是动态的生成html代码将pageInfo中的数据显示在上边的tbody中

 1 // 填充表格
2 function fillTableBody(pageInfo) {
3 // 判断pageInfo对象是否有效
4 if(pageInfo == null || pageInfo == undefined || pageInfo.list == null || pageInfo.list.length == 0) {
5 $("#rolePageBody").append("<tr><td colspan='4' align='center'>抱歉!没有查询到您搜索的数据!</td></tr>");
6
7 return ;
8 }
9
10 // 使用pageInfo的list属性填充tbody
11 for(var i = 0; i < pageInfo.list.length; i++) {
12
13 var role = pageInfo.list[i];
14
15 var roleId = role.id;
16
17 var roleName = role.name;
18
19 var numberTd = "<td>"+(i+1)+"</td>";
20 var checkboxTd = "<td><input id='"+roleId+"' class='itemBox' type='checkbox'></td>";
21 var roleNameTd = "<td>"+roleName+"</td>";
22
23 var checkBtn = "<button type='button' class='btn btn-success btn-xs'><i class=' glyphicon glyphicon-check'></i></button>";
24
25 // 通过button标签的id属性(别的属性其实也可以)把roleId值传递到button按钮的单击响应函数中,在单击响应函数中使用this.id
26 var pencilBtn = "<button id='"+roleId+"' type='button' class='btn btn-primary btn-xs pencilBtn'><i class=' glyphicon glyphicon-pencil'></i></button>";
27
28 // 通过button标签的id属性(别的属性其实也可以)把roleId值传递到button按钮的单击响应函数中,在单击响应函数中使用this.id
29 var removeBtn = "<button id='"+roleId+"' type='button' class='btn btn-danger btn-xs removeBtn'><i class=' glyphicon glyphicon-remove'></i></button>";
30
31 var buttonTd = "<td>"+checkBtn+" "+pencilBtn+" "+removeBtn+"</td>";
32
33 var tr = "<tr>"+numberTd+checkboxTd+roleNameTd+buttonTd+"</tr>";
34
35 $("#rolePageBody").append(tr);
36 }
37
38 }

这样问题就来了,如果我们用传统的click方法绑定动态生成的button(上边代码第31行就是动态生成的button),就会出现问题,当我们翻页的时候,页面的按钮就又会重新生成,此时click就不会绑定到重新生成的按钮上,从而再次点击按钮时没有响应。

传统的click方法绑定动态生成的button:

$(".pencilBtn").click(function () {
alert("xxx");
});

此时要解决这个问题,就要用到jquery的事件处理函数on()方法。

on函数有三个参数:

  • 第一个参数需要传入事件类型:             注意:事件类型是不带小括号的,不要写成click(),应该写click

    •   例如单击事件就传入click,失去焦点事件传入blur,表单提交事件传入submit。
  • 第二个参数需要传入要绑定事件的元素的选择器。           注意:元素选择器不要写成$("#xxxx"),直接写#xxx就可以了
  • 第三个参数需要传入事件的响应函数。
<script type="text/javascript">
$(function(){
// ①首先找到所有“动态生成”的元素所附着的“静态”元素
// ②on()函数的第一个参数是事件类型
// ③on()函数的第二个参数是找到真正要绑定事件的元素的选择器
// ③on()函数的第三个参数是事件的响应函数
$("#rolePageBody").on("click",".pencilBtn",function(){
alert("xxx");
});
});
</script>

注:“动态生成”的元素所附着的“静态”元素,即js动态生成的html元素在html页面的父标签,例如上边代码中所有动态生成的html代码都要附着在id=rolePageBody的tbody中,所以需要动过这个依附的tbody对象来调用on方法。

jquery给动态生成的元素绑定事件,on函数的更多相关文章

  1. [jquery] 给动态生成的元素绑定事件 on方法

    用底下的方法尝试了好多次都失败 $('.del').on('click',function(){ alert('aa'); })// 失败!! 终于在准备放弃前看到一篇博文说的方法 $(documen ...

  2. WEB前端技巧之JQuery为动态添加的元素绑定事件.md

      jquery 为动态添加的元素绑定事件 如果直接写click函数的话,只能把事件绑定在已经存在的元素上,不能绑定在动态添加的元素上 可以用delegate来实现 .delegate( select ...

  3. Angular如何给动态生成的元素绑定事件

    在AngularJS中,操作DOM一般在指令中完成,事件监听机制是在对于已经静态生成的dom绑定事件,而如果在指令中动态生成了DOM节点,动态生成的节点不会被JS事件监听. 举例来说: angular ...

  4. jQuery:如何给动态生成的元素绑定事件?

    jQuery的html()可以给现在元素附加新的元素,innerHTML也可以,那么,如何给这些新生成的元素绑定事件呢?直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本不存在. 然而, ...

  5. jQuery对于动态生成的元素绑定无效的问题~~

    问题:很多时候发现,对动态生成的元素绑定click事件是无效的- 原因:直接绑定到动态生成的元素是无效的,是因为Jquery扫描文档找出所有的$(‘’)元素,并把函数绑定到每个元素的click事件上, ...

  6. jQuery 为动态添加的元素绑定事件

    在使用jquery的方式为元素绑定事件时,我经常使用bind或者click,但这只能为页面已经加载好的元素绑定事件.像需要用ajax的方式请求远程数据来动态添加页面元素时,显然以上几种绑定事件的方式是 ...

  7. jQuery对 动态添加 的元素 绑定事件(on()的用法)

    从jQuery 版本 1.7 起,on() 方法是向被选元素添加事件处理程序的(官方推荐)首选方法. 当浏览器下载完一个页面的时候就开始渲染(翻译)HTML标签,然后执行css.js代码,在执行js代 ...

  8. jquery append 动态添加的元素绑定事件on

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...

  9. Angularjs给动态生成的元素绑定事件

    //获取动态生成的元素 getJqforAnguar:function(jqid){ angular.element(document).injector().invoke(function($com ...

随机推荐

  1. POJ2060最小路径覆盖

    题意:       有n个任务,如果时间来得及干完某些任务后还可以接着干别的任务,给一个任务清单,问最少派出去多少人能完成所有任务. 思路:        比较简单的追小路径覆盖问题了,在DAG中找到 ...

  2. Windows核心编程笔记之错误处理

    0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...

  3. node-mongo-服务器封装

    分为三个文件 mongo.js基本的封装了下mongo数据库操作 workmongo.js 里面有路由和解析操作(可以根据具体业务进行扩充) mainmongo.js 服务器相关 调用例子: 查询数据 ...

  4. Swift系列三 - 函数

    函数在任何语言中都是存在的,Swift中函数更加灵活. 一.函数的定义 1.1. 有返回值(形参默认是let,也只能是let) func pi() -> Double { return 3.14 ...

  5. Spring Cloud Alibaba(9)---Sentinel概述

    Sentinel概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护.热点防 ...

  6. C# 多线程技术

    这节讲一下多线程(Thread)技术. 在讲线程之前,先区分一下程序,进程,线程三者的区别,大体上说,一个程序可以分为多个进程,一个进程至少由一个线程去执行,它们是层层包含的关系.我们写的程序,就是一 ...

  7. Codeforces Round #704 (Div. 2)

    A. Three swimmers 题意:第一个人跳水是每隔a分钟去一次,第二个人跳水是每隔b分钟,第三个人跳水是每隔c分钟,一个人准备在p分钟的 时候去跳水,问需要最少等待多长时间才能轮到前三个人 ...

  8. 一文读懂 SuperEdge 云边隧道

    作者 李腾飞,腾讯容器技术研发工程师,腾讯云TKE后台研发,SuperEdge核心开发成员. 杜杨浩,腾讯云高级工程师,热衷于开源.容器和Kubernetes.目前主要从事镜像仓库,Kubernete ...

  9. 如何通过CRM解决公司业绩下滑的问题

    大部分公司都需要新客户的支持来维持市场和实现预期的目标.尽管销售部门一直在努力,但这种努力还是无法阻止业绩下降. 想要做到销售增长,不仅要取决企业的进步,还需要改掉使业绩下降的问题.小Z将从四个方面对 ...

  10. Nacos C++客户端开发文章

    前段时间关注了下阿里巴巴发起的开源项目Nacos,这是一个注册.配置中心(Naming And Config),支持各种语言的客户端,但是唯独没有C++的,考虑到以前做过一段时间的C++程序员,不禁一 ...