如何将事件添加到在运行时创建的元素?

时间:2014-09-18 06:02:18

标签: javascript jquery

在以下代码中,添加按钮动态地将包含删除按钮的<TR>附加到表中。以下代码$('a.remove_performer').live()收到错误“Uncaught TypeError:undefined is not a function”且无法附加事件处理程序?

更新live()更改为on(),错误消失了。但是,事件处理程序仍未附加。

http://jsfiddle.net/emg9yxwc/1/

<table>
    <thead>
        <tr>
            <th>Column1</th>
            <th></th>
        </tr>
    </thead>
    <tbody id="performerBody"></tbody>
    <tfoot>
        <tr>
            <td>
                <select id="performerList" name="performerList" class="valid">
                    <option value="1">performer1</option>
                    <option value="2">performer2</option>
                </select>
            </td>
            <td><a id="addNewPerformer" href="#" class="add_performer">Add</a>

            </td>
        </tr>
    </tfoot>
</table>

<script>
$(document).ready(function () {
    // Add new row
    $("#addNewPerformer").click(function (e) {
        e.preventDefault();
        $last = $("#performerBody tr:last");
        var index = 0;
        if ($last.length > 0) {
            index = $last.find(':input:first').attr('name').match(/\d+/);
            index = parseInt(index) + 1;
        }
        var selected = $("#performerList").val();
        if ($('#performerBody input[value="' + selected + '"]').length === 0) {
            var name = "Performers[" + index + "].Id";
            var selectedText = $("#performerList :selected").text();
            $("#performerBody").append('<tr><td><span style="display:none"><input name="' + name + '" type="number" value="' + selected + '"></span>' + selectedText + '</td><td><a href="#" class="remove_performer">Remove</a></td></tr>');
        }
    });

    // Remove
    $('a.remove_performer').on("click", function (e) { // was live
        e.preventDefault();
        $(this).parent().parent().remove();
    });
});
</script>

1 个答案:

答案 0 :(得分:3)

.live()已弃用 1.7 ,已删除 1.9

事件处理程序仅绑定到当前选定的元素;它们必须存在于您的代码进行事件绑定调用时的页面上。

您需要使用Event Delegation委托事件方法{。}}来使用.on()

  

委派事件的优点是,它们可以处理来自稍后添加到文档的后代元素的事件。通过选择在附加委托事件处理程序时保证存在的元素。

$(document).on('event','selector',callback_function)

代替document,您应该使用最近的静态容器。

根据您的代码。使用

$("#performerBody").on('click', 'a.remove_performer', function (e) {
    e.preventDefault();
    $(this).parent().parent().remove();
});