给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主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件
随机推荐
- java ---- 面试题
1.java 语言如何进行异常处理,关键字:throws.throw.try.catch.finally分别代表什么意义?finally代码是在return之后还是之前执行? throws是获取异常, ...
- ITShare
框架底层通过IBatis和XML实现ORM映射: 业务处理类似UI,通过Controller和JavaScript交互: 视图通过Castle与NVelocity实现,jquery.tmpl渲染: . ...
- Zabbix监控
安装zabbix首先需要安装Nginx+Mysql+PHP,然后再安装zabbix 安装zabbix1:创建用户及组: groupadd zabbix useradd -g zabbix zabbix ...
- iOS之访问权限以及跳转到系统界面
iOS开发中有时候有这样的需求:当用户设置不允许访问照片.麦克风和相机等系统权限的时候,这时需要直接跳转到系统的隐私界面进行设置. 判断是否开启权限 前面已经说过,我们需要在用户不允许访问的时候跳转, ...
- Git 分支管理和冲突解决
Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支 ...
- Jquery 小技巧
[每个程序员都会的35个jQuery的小技巧]收集的35个jQuery的小技巧/代码片段,可以帮你快速开发
- 使用node.js生成excel报表下载(excel-export express篇)
引言:日常工作中已经有许多应用功能块使用了nodejs作为web服务器,而生成报表下载也是我们在传统应用. java中提供了2套类库实现(jxl 和POI),.NET 作为微软的亲儿子更加不用说,各种 ...
- Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南
Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完 ...
- Qt-为应用程序添加logo
在Qt Creator中新建Qt Resource File,名字为logo.qrc 1.选择Add Prefix得到/new/prefix1 2.然后Add Files,将文件添加进去,如CA-DC ...
- TI PDK3.0 qt 交叉编译环境设置
上午剑锋给的方法,成功在qtcreator上面加入TI官方的qmake以及他的交叉编译器. 1. 步骤如下: 1. 我假设TI PDK3.0 安装目录为顶层目录. 2. 进入linux-devkit ...
