异步请求数据后,动态向table中追加行,行点击事件失效

如题所述

动态加入到DOM中的对象无法继承原有的事件,所以无效,举例:

// $.ajax... ajax部分省略
var tr = "";
if(data.length){
    for(var i=0; i<data.length; i++){
        tr = '<tr>';
        tr += '<td>' + data.status == 0 ? "正常" : "报警" + '<td>';
        tr += '</tr>';
        $("#table1").find("tbody").append(tr);
    }  
}

// tr的点击事件
$("#table1 tbody").find("tr").click(function(){
    // do something
});

上面的例子中,table1中原有的tr标签有点击事件,而通过ajax获取数据动态创建添加到DOM中的tr标签并没有继承点击事件,点击无任何反应。解决办法有两种:

    纯js方法:将tr的点击事件写成函数,然后为动态创建的tr标签添加该函数的onclick事件:

    for(var i=0; i<data.length; i++){
            tr = '<tr onclick="OnTrClick()">'; // 创建时为tr指定click事件
            tr += '<td>' + data.status == 0 ? "正常" : "报警" + '<td>';
            tr += '</tr>';
            $("#table1").find("tbody").append(tr);
    }

    jquery方法:jquery中可使用live()、on()两个方法来完成类似效果,其原理是利用事件委派机制,需要注意的是jquery 1.9版本已不再支持live()方法。

    // tr的点击事件 (jquery 1.9以下)
    $("#table1 tbody").find("tr").live("click", function(){
        // do something
    });


// tr的点击事件【推荐】 (jquery 1.7以上)
$("#table1 tbody").find("tr").on("click", function(){
    // do something
});

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-08-08
用on绑定到上级元素上面

jquery ajax动态添加一行TR后,点击新添加的行,不能触发该的事件,必须...
事件是在网页加载的时候都绑定好了,动态添加的tr上其实并没有绑定事件,如果想动态绑定的话可以用live来绑定,live方法用法和bind相同。比如想给所有tr动态绑定click事件,$("tr").live("click",function(){\/*………*\/}) ,强烈建议你在动态添加tr后给新添加的tr单独绑定一次事件 ...

JQUERY方法给TABLE动态增加行
为table指定行添加一行 tab 表id row 行数,如:0->第一行 1->第二行 -2->倒数第二行 -1->最后一行 trHtml 添加行的html代码 \/ function addTr(tab, row, trHtml){ \/\/获取table最后一行 $("#tab tr:last")\/\/获取table第一行 $("#tab tr").eq(0)\/\/获取table倒数第二行 $("#...

弹出窗口,提交数据,返回父页面表格追加一行。
猜的没错的话你要实现的功能应该用ajax做 在新窗口提交的时候用ajax把数据提交到数据库然后把反悔的数据局部刷新到表格底部

调用什么方法,可以在当前的DataTable对象的末尾追加一个新行?
给DataTable中添加一行数据 一.如果该DataTable有两列,列的名称是Name,Age,且该DataTable的名称是dt;DataRow dr = dt.NewRow();dr["Name"] = "Adam";dr["Age"] = 6;dt.Rows.Add(dr);

javascript浏览器兼容性需要注意的几点
一、向表追加行 在以往使用Ajax的经历中,你很可能会使用JavaScript向现有的表中追加行,或者从头创建包含表行的新表。document.createElement和document.appendChiid方法可以使这很容易做到,只需使用document.createElement创建表单元格,再使用document.app-endChild方法将这些表单元格增加到表行。接下来的编辑步骤是使用docum...

创建一个简单的html页面,实现动态的增加删除行的同事实现奇偶行不同色...
以前写过的设置背景色的,凑合看看:\/\/tableid:表格id function linescolor(tableid) { var tb = document.getElementById(tableid);if (tb === null || typeof tb === 'undefined')return;var rows = tb.rows.length;var rows_sum = 0;if (rows > 1) { for (var i = 1; i <...

...请问我用ajax怎么把请求到的数据追加到table标签里面
= $(this).find('name').text();var age = $(this).find('age').text();html += tdHead + name + tdFoot + tdHead + age + tdFoot + "<\/tr>";});("#t2 tr:gt(0)").remove();\/\/这一句清空上一次的请求数据 ("#t2").append(html);\/\/往表单里面追加数据 } });} ...

在单元格数据录入中,jtable是追加方式,可是客户习惯了excel的单击选中...
public class TableWithOverwrite extends JTable { public final static String EXCLUDE = "F2";private boolean isBlankEditor = false;public TableWithOverwrite() { super();} public TableWithOverwrite(TableModel tm) { super(tm);} Override public Component prepareEditor(TableCellEditor editor,...

“\/WebSite”应用程序中的服务器错误。
本文就来简单分析这种错误的一般原因。 一、应用程序没有检查内存分配失败 程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是「动态内存分配」,内存地址也就是编程中的「光标...

C#编程中如何改变DataTable里的某一条记录?
1. \/\/获取Employees表中的第4行数据 2. DataRow drEmployee = dtEmployees.Rows[3];3.4. drEmployee.BeginEdit();5.6. drEmployee("EmpName") = "John";7. drEmployee("Title")="Sales";8. drEmployee.EndEdit();没看明白可以查看参考资料 参考资料:<a href="http:\/\/book.51cto....

相似回答