javascript - Javascript 中的动态表和事件委托(delegate)

标签 javascript jquery

我有一个按钮可以在 mytable 中添加一行

   function addRow() {

    $('#mytable').append('<tr>' +
    '<td ><div style="width:187px">' +
    ' <input type="text" value="" style="width: 150px" name="item.Account_Code"  >' +
    '<button type=\'button\' style="position: relative; left:3px" id="AccCode">...</button>' +
    '</div></td>' +
    '<td><input type="text" style="width: 200px" name="item.Description"></td>' +
    '<td><input type="text" value="0.00" style="width: 100px" name="item.Debit_Amt" onkeydown="return ValidateNumber(event);"></td>' +
    '</tr>')};

当我尝试使用事件处理程序捕获 td 时,事件的结果会触发多次。例如,在这种情况下,警报消息会多次弹出。

    $('#mytable').delegate("td", "blur", function () {

    var self = $(this);
    var tr = self.closest('tr');
    index = tr.index();

     $('#mytable').find('tr:eq(' + index + ')').find('td:eq(1)').find('input[type=text]').blur(function () {
     alert("abcd");
     )}
     )}

我第一次模糊 td,显示 1 条警报消息。但下次我模糊时,会出现 2 条或更多警报消息,而不是 1 条。我越模糊该 td,就会弹出更多警报消息,而不是 1 条。原因是什么以及如何解决?

最佳答案

因为每次发生模糊时,您都会向输入元素添加一个新的 blur 处理程序。

相反,您需要的是如下所示的单个委托(delegate)事件处理程序,而且由于您的输入元素有 name,因此可以使用 name 属性值来定位输入元素。

function addRow() {

  $('#mytable').append('<tr>' +
    '<td ><div style="width:187px">' +
    ' <input type="text" value="" style="width: 150px" name="item.Account_Code"  >' +
    '<button type=\'button\' style="position: relative; left:3px" id="AccCode">...</button>' +
    '</div></td>' +
    '<td><input type="text" style="width: 200px" name="item.Description"></td>' +
    '<td><input type="text" value="0.00" style="width: 100px" name="item.Debit_Amt" onkeydown="return ValidateNumber(event);"></td>' +
    '</tr>')
};

$('#mytable').on('blur', 'input[name="item.Description"]', function () {
    //or $('#mytable').delegate('input[name="item.Description"]', "blur", function () {
    alert("abcd");
});

$('button').click(addRow);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button id="">Add</button>
<table id="mytable"></table>

关于javascript - Javascript 中的动态表和事件委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28710477/

相关文章:

javascript - 在 axios 请求返回数据之前加载 Vuejs 页面

javascript - 在 IE11 中捕获跨域 JS 错误

javascript - WordPress 下拉菜单在我的主题中不起作用

javascript - 如何在数组中查找数组并将其删除?

javascript - 为 IE 包含 es6-promise 的优雅方式

javascript - Cordova FileTransfer 插件无法在 Android 5+ 上运行

jquery - 反向滚动显示脚本

javascript - 将变量传递给 jquery eq()

javascript - 无法使用 AJAX 和 JSON 响应在 HTML 中创建表格

javascript - 在已打开的网页上运行测试用例