javascript - 如何对动态添加的元素执行动态操作?

标签 javascript jquery html

我的目标:

  • 使用 JS/Jquery 动态填充“performer-payments”表
  • 对于表格中的每一行(动态添加的),其中一个数据单元格包含一个下拉框。
  • 此下拉框应在选择某个选项时使另一个下拉框可见(在同一单元格中)。否则,第二个下拉菜单应该是不可见的。
  • 我在其他地方通过 toggleVisible 函数实现隐藏/显示动态,它只是添加由 css 标记的自定义类以隐藏或显示元素。

相关代码:

我要填充的表:

<table id='performer-payments' class='performer-profile payments-table'>              
    <tr>
        <th> Period </th>                                                             
        <th> Amount </th>                                                             
        <th> Paid? </th>                                                              
    </tr>
</table>

填充表格的代码:

for (period in data['Performers'][performer]['Payments']) {
    var amount = utils.calcPerformerCut(data, performer, period);                 
    var row = "<tr>";
    row += "<td> " + period + " </td>";
    row += "<td> " + amount + " $ </td>";
    row += "<td>";
    row += "<div class='performer-profile payment-status'>";
    row += data['Performers'][performer]['Payments'][period];
    row += "</div>";
    row += "<select id='payment-status-" + performer + "-" + period + "' class='perfomer-profile hidden-onload displayNone payment-status-menu'>";
    row += "<option value='paid'>Paid</option>";
    row += "<option value='unpaid'>Unpaid</option>";
    row += "<option value='transfer'>Transfer to...</option>";
    row += "</select>";
    row += "<select id='payment-transfer-period-" + performer + "-" + period + "' class='performer-profile hidden-onload displayNone payment-period-menu'>";
    for (var i=0; i < data['Periods'].length; i++) {                              
        row += "<option value='" + period + "'>" + period + '</option>';          
    }
    row += "</select>";
    row += "</td>";
    row += "</tr>";

    $('#performer-payments').append(row);
    $('#performer-payments').on('change', {perf: performer, per: period}, function (even) {
        if (even.target.value == 'transfer') {
            utils.toggleVisible($('#payment-transfer-period-' + even.data.perf + '-' + even.data.per), true);
        } else {
            utils.toggleVisible($('#payment-transfer-period-' + even.data.perf + '-' + even.data.per), false);
        }
    });
}

作为引用,切换可见性的代码:

exports.toggleVisible = function (selector, visible) {
    if (visible) {
        selector.removeClass('displayNone').addClass('displayBlock');
    } else {
        selector.removeClass('displayBlock').addClass('displayNone');
    }
}

这有(至少)两个问题:

  • #payment-transfer-period-... 选择框永远不会显示,即使在第一个选择框中选择了“转移”选项也是如此。从调试工作来看,在我看来,#payment-transfer-period-.. 由于某种原因可能还不是有效对象,或者类似的东西。
  • (显然,真的),on-change 事件被触发了 N 次(N=周期数),因为我只是告诉程序在表中的某些内容发生变化时触发。我希望它只针对相关的下拉菜单触发,但是当我尝试将 #payment-status-... 作为选择器添加到 .on() 函数时,它永远不会触发。

注意:总的来说,我欢迎对此的反馈——我是一名经验丰富的程序员,但对 HTML/JS/Jquery 的经验很少。此外,我决定不为该项目使用模板,因为我正在尝试学习基础知识,所以如果您看到我“动态”向表中添加行的方式而得了胰腺炎,我深表歉意,但这部分是故意的。

除此之外,如果这里有什么不清楚的地方,请要求澄清。

编辑:这里是数据结构的相关部分:

data = {
    'Performers': {
        'Dira Klaggen': {
            'Payments': {
                'Q1': 'Paid',
                'Q2': 'Paid',
                'Q3': 'Unpaid'
            },
        },
        'Holden Bolden': {
            'Payments': {
                'Q2': 'Transferred to Q3',
                'Q3': 'Unpaid'
            }
        },
        'Manny Joe': {
            'Payments': {
                'Q1': 'Paid',
                'Q2': 'Unpaid',
                'Q3': 'Unpaid',
            }
        }
    },
    'Periods': [
        'Q1',
        'Q2',
        'Q3'
    ]
}  

最佳答案

您没有将 change 处理程序附加到正确的元素。我应该是行中的第一个 select...而不是整个 table

试试这个改变处理程序:

$('#performer-payments').find('#payment-status-' + performer + '-' + period).on('change', function(){
  if ($(this).val() == 'transfer') {
    $(this).next('select').show();
  } else {
    $(this).next('select').hide();
  }
});


第二种方法:
您可以通过为第一个 select 使用类而不是“复杂的”唯一 id 来简化它。

假设您使用“payment-status”:

处理程序将是:

$('#performer-payments').on('change', '.payment-status', function(){
  if ($(this).val() == 'transfer') {
    $(this).next('select').show();
  } else {
    $(this).next('select').hide();
  }
});

并且此处理程序可以在行附加循环之外,因为它使用 delegation .

关于javascript - 如何对动态添加的元素执行动态操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542917/

相关文章:

php 与 html 和 javascript 通信

jquery dataTables - 如何提取行数据 onclick 事件

javascript - PHP 流套接字不适用于 HTML5 套接字?

javascript - extJs Json 阅读器

javascript - 如何使用 js 触发 only-css 模式

php - 根据需要锁定表单上的输入

javascript - Laravel,无法弄清楚如何使用下拉菜单显示特定年份的主题

javascript - 使用 Canvas 在 Javascript 中制作动画

javascript - 两个窗口或选项卡之间的跨文档消息传递,而不是 IFrame

html - 使用移动模拟器进行移动开发的视口(viewport)