给DOM生成的元素添加事件
问题:通过js给页面添加新元素,并给该元素添加绑定事件,但新添加的元素上却没有绑定任何事件。
常见例子:在处理表格的时候,每行行末有个删除按钮,如下图。点击删除按钮的时候删除这一行。
//html部分
<table border="" cellspacing="" cellpadding="" class="text-center">
<caption class="text-center">用户信息表</caption>
<tr>
<td>序号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>操作</td>
</tr>
<tr>
<td>1</td>
<td>张三</td>
<td>男</td>
<td>18</td>
<td>
<a class="deltr">删除</a>
</td>
</tr>
</table>
<button class="btn btn-info">添加</button> //js部分
$(function() {
$("button").on("click", function() {
$("table").append('<tr><td>2</td><td>张三</td><td>男</td><td>18</td><td><a class="deltr">删除</a></td></tr>');
})
$(".deltr").on("click", function() {
$(this).parents("tr").remove();
})
})
如果上图中的删除按钮在dom操作前就在页面中的话,给其添加是可以的;如果表格中的每行都是通过dom操作添加的话,可以发现,删除按钮上却没有绑定任何事件。那么要怎么做才可以给dom生成的元素添加事件呢?
方法一:onclick法
$(function() {
$("button").on("click", function() {
$("table").append('<tr><td>2</td><td>张三</td><td>男</td><td>18</td><td><a onclick="deltr(this)">删除</a></td></tr>');
}) })
function deltr(delbtn){
$(delbtn).parents("tr").remove()
}
ps:该方法没有实现结构与行为分离的准则。关于dom操作添加事件一般采用的都是该方法。
注意:此时的deltr这个function必须是全局函数,得放在$(function(){})外面,放里面就成局部函数了,html里的onclick就调用不到了。
方法二:DOM 生成事件后绑定
在dom操作生成元素之后,添加事件。如下
$(function() {
$("button").on("click", function() {
$("table").append('<tr><td>2</td><td>张三</td><td>男</td><td>18</td><td><a>删除</a></td></tr>');
$("table a").on("click",function(){
deltr($(this));
})
}) })
function deltr(delbtn){
$(delbtn).parents("tr").remove()
}
方法三: 事件委托
$("body").on("click", "table a", function(){
deltr($(this));
})
运行此段代码,会发现功能根本无法实现。这是因为此时函数内的 this 指向 body;
$("body").on("click", "table a", function(e){
if(e.target.nodeName = "a"){
console.log($(this))
}
})
因为事件是冒泡的,所以我们要阻止冒泡到 body 之前,使用 e.target 截取到触发事件的元素上。
给DOM生成的元素添加事件的更多相关文章
- 给DOM操作生成的元素添加事件
问题:通过js给页面添加新元素,并给该元素添加绑定事件,但新添加的元素上却没有绑定任何事件. 常见例子:在处理表格的时候,每行行末有个删除按钮,如下图.点击删除按钮的时候删除这一行. //html部分 ...
- jquery动态生成的元素添加事件的方法
动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...
- jquery无法为动态生成的元素添加点击事件的解决方法
遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <d ...
- 给Jquery动态添加的元素添加事件
给Jquery动态添加的元素添加事件 来源:[http://wangqixia.diandian.com/post/2011-05-10/6597866] 我想很多人都会向我一样曾经 被新元素的事件绑 ...
- 通过原生JS实现为元素添加事件
自己写了一个为元素添加事件的方法,并封装到对象中. 说明: id : 目标元素的ID type: 事件的类型,注意的是不能加on fn:事件处理程序 isBubble :规定事件流 代码: var b ...
- [转载]给Jquery动态添加的元素添加事件
原文地址:给Jquery动态添加的元素添加事件作者:小飞侠 我想很多人都会向我一样曾经 被新元素的事件绑定困惑很久也就是在页面加载完成后给元素绑定了事件,但又新增加的元素上却没有绑定任何事件. js的 ...
- Angular如何给动态生成的元素绑定事件
在AngularJS中,操作DOM一般在指令中完成,事件监听机制是在对于已经静态生成的dom绑定事件,而如果在指令中动态生成了DOM节点,动态生成的节点不会被JS事件监听. 举例来说: angular ...
- jQuery:如何给动态生成的元素绑定事件?
jQuery的html()可以给现在元素附加新的元素,innerHTML也可以,那么,如何给这些新生成的元素绑定事件呢?直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本不存在. 然而, ...
- 使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件
使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件
随机推荐
- Nginx配置SSL证书部署HTTPS网站
1.购买ssl证书 购买网站:沃通 2.上传证书到nginx服务器,然后进行解压. 解压后的的效果: [root@bubidev-ng3 nginx]# pwd/etc/nginx [root@bub ...
- 移动端自适应:flexible.js可伸缩布局使用
http://caibaojian.com/flexible-js.html 阿里团队开源的一个库.flexible.js,主要是实现在各种不同的移动端界面实现一稿搞定所有的设备兼容自适应问题. 实现 ...
- 入门:Java Map<String,String>遍历及修改
重点:在使用Map时注意key-value,key用于检索value的内容. 在正常情况下,可以不允许重复:在java中分为2中情况,一是内存地址重复,另一个是不同的地址但内容相等. 在使用Map是一 ...
- 逐行扫描型Memory LCD显存管理与emWin移植
因为Memory LCD 的特性,不能设置像素坐标,只能用缓存整体刷新. 所以对于Memory LCD来说,emWin移植仅与打点函数有关,这里用Sharp Memory LCD(ls013b7dh0 ...
- tomcat配置
修改可用内存大小 D:\escloud\apache-tomcat-7.0.63\bin 下修改catalina.bat set "JAVA_OPTS=-Xms1024m -Xmx1024m ...
- php内部函数
strpos函数 /** haystack:被比较字串首地址(指向被比较字符串) needle:源字串首地址(指向源字符串) needle_len:源字符串长度 end:指向最后一个字符地址的下一个内 ...
- js控制只能输入数字和控制小数的位数
<input class="form130" style="width: 80px;" maxlength="10" id=" ...
- 一个php 字符串判断问题
先看代码 你觉得下面的代码会输出什么结果: <?php $a = "10"; $b = "1e1"; if($a == $b ) { echo " ...
- Excel——使用OFFSET、MATCH、COUNTA实现二级菜单
如图所示,接下来提供两种办法实现: 1.将A.B.C.D定义为名称NAME. 2.设置一级菜单单元格数据有效性为NAME. 3.设置二级菜单格数据有效为: =OFFSET($A$1,MATCH($A6 ...
- mysql 编译安装
mysql 编译安装方式: ```cd /home/oldboy/tools``` 创建 目录 if not have then mkd ...