AJAX / jQuery生成的输入无法被其他jQuery脚本识别

时间:2018-02-07 17:12:25

标签: javascript jquery html ajax checkbox

我认为这是一个相对简单的问题。出于测试目的,我已经使它变得如此简单,以便找到问题。

我有一个与AJAX一起工作的jQuery脚本,可以在复选框旁边返回一些结果,如下所示:

$.ajax({
            type:'GET',
            url: '/customers/details/emails',
            dataType:'json',
            data: {
                'customerID': $('select[name=payer_id]').val(),
               '_token': $('input[name=_token]').val(),
            },
                success: function(data) {
                    $('.errorTitle').addClass('hidden');
                    $('.errorContent').addClass('hidden');

                    if ((data.errors)) {
                        setTimeout(function () {
                            $('#createOrigin').modal('show');
                            toastr.error('Check your inputs!', 'Error Alert', {timeOut: 5000});
                        }, 500);

                        if (data.errors.title) {
                            $('.errorTitle').removeClass('hidden');
                            $('.errorTitle').text(data.errors.title);
                        }
                        if (data.errors.content) {
                            $('.errorContent').removeClass('hidden');
                            $('.errorContent').text(data.errors.content);
                        }
                    } else {
                         $.each(data, function(i,val) {
                                    $('<tr>').append(
                                    $('<td>').html('<input type="checkbox" id="emailCheckboxSelect">'),
                                    $('<td>').text(val)).appendTo('#customerEmails');

               });
              }
             }
            });

正如您可以看到的那样,对于每个结果,附加一个表格行,并带有一个ID为&#34的复选框; emailCheckboxSelect&#34;。

现在我的问题,这些显然是动态创建的元素,所以我相信这是这个脚本的问题(一个简单的假人只是为了找到问题)。这是应该工作的脚本:

$(function(){
    $('#emailCheckboxSelect').click(function(){
        alert('clicked');
    });
});

这不适用于动态创建的元素。但是,我确实将<input type="checkbox" id="emailCheckboxSelect">Checkbox直接添加到了我的页面,这确实会引发警报。

那么我做错了什么以及我需要做什么才能让jQuery识别动态创建的元素?

2 个答案:

答案 0 :(得分:2)

  1. 尝试将$ .each(data,function(){})之后的click事件绑定到sucess:function(){}

  2. 您在DOM中使用具有相同ID的多个元素:元素ID在整个文档中应该是唯一的。

  3. 使用类

  4. 您的代码将如下所示:

    $.ajax({
        type: 'GET',
        url: '/customers/details/emails',
        dataType: 'json',
        data: {
            'customerID': $('select[name=payer_id]').val(),
            '_token': $('input[name=_token]').val(),
        },
        success: function(data) {
            $('.errorTitle').addClass('hidden');
            $('.errorContent').addClass('hidden');
    
            if ((data.errors)) {
                setTimeout(function() {
                    $('#createOrigin').modal('show');
                    toastr.error('Check your inputs!', 'Error Alert', {
                        timeOut: 5000
                    });
                }, 500);
    
                if (data.errors.title) {
                    $('.errorTitle').removeClass('hidden');
                    $('.errorTitle').text(data.errors.title);
                }
                if (data.errors.content) {
                    $('.errorContent').removeClass('hidden');
                    $('.errorContent').text(data.errors.content);
                }
            } else {
                $.each(data, function(i, val) {
                    $('<tr>').append(
                        $('<td>').html('<input type="checkbox" class="emailCheckboxSelect" />'),
                        $('<td>').text(val)).appendTo('#customerEmails');
    
                });
                $('.emailCheckboxSelect').click(function(e) {
                    alert('clicked');
                });
            }
        }
    });
    

答案 1 :(得分:1)

尝试将click事件更改为

$('td').on('click', '.emailCheckboxSelect', function () {
  alert('clicked');
});

这适用于动态创建的元素。另外,对动态创建的元素使用class而不是id。