João Costa
João Costa

Reputation: 519

Working with dynamically added elements in jquery

I'm having a big trouble working with dynamically added elements. I can't get class or data-attribute from added elements even using ".on()" selector like proposed on this other question. I have this form:

    <div class="row">

        <div class="col-md-12">
            <form action="" class="form-horizontal" id="newVehicle" method="post" accept-charset="utf-8">

    <!-- First form-group -->

                <div class="form-group specs" data-class="specs">
                    <label for="" class="col-sm-2 control-label">Especificações</label>
                    <div class="col-sm-4">
                        <select class="form-control" name="specs[]">
                            <option></option>
                            <option data-target="new-equip">Novo equipamento</option>
                        </select>
                    </div>
                    <div class="col-sm-2">
                        <div class="btn-group" role="group" aria-label="">
                            <a href="" class="btn btn-default btnNew"><span class="glyphicon glyphicon-pencil"></span></a>
                            <a href="" class="btn btn-default btnPlus"><span class="glyphicon glyphicon-plus"></span></a>
                        </div>
                    </div>
                </div>

<!-- Second form group -->

                <div class="form-group equips" data-class="equips">
                    <label for="" class="col-sm-2 control-label">Equipamento</label>
                    <div class="col-sm-4">
                        <select class="form-control" name="equips[]">
                            <option></option>
                            <option data-target="new-equip">Novo equipamento</option>
                        </select>
                    </div>
                    <div class="col-sm-2">
                        <div class="btn-group" role="group" aria-label="">
                            <a href="" class="btn btn-default btnNew"><span class="glyphicon glyphicon-pencil"></span></a>
                            <a href="" class="btn btn-default btnPlus"><span class="glyphicon glyphicon-plus"></span></a>
                        </div>
                    </div>
                </div>

            </form>
        </div>

    </div>

I'm trying to add new form-group when pressing ".btnNew" giving attribute name same as elements before. It only works on first element, but on added elements it won't work.

My javascript:

$('#newVehicle').on('click', '.btnMinus, .btnNew, .btnPlus',function(event) {
    event.preventDefault();
    /* Act on the event */
    var formGroupClass = $(this).closest('.form-group').attr('data-class');
    console.log($(this).closest('.form-group').attr('class'));
    if($(this).hasClass('btnMinus')) {
        if($(this).closest('.form-group').is('.' + formGroupClass + ':first-child')) {
            return false;
        } else {
            $(this).closest('.form-group').remove();
        }
    }
    if($(this).hasClass('btnPlus')) {
        $(this)
        .closest('.form-group')
        .after('<div class="form-group ' + formGroupClass + '" data-clas="' + formGroupClass + '"></div>')
        .next()
        .append('<label for="" class="col-sm-2 control-label"></label>')
        .append('<div class="col-sm-4"></div>')
        .append('<div class="col-sm-2"></div>')
        .children('div.col-sm-4')
        .append('<select class="form-control" name="' + formGroupClass + '[]"></select>')
        .children('select')
        .append('<option></option>')
        .closest('.form-group')
        .children('div.col-sm-2')
        .append('<div class="btn-group" role="group" aria-label=""></div>')
        .children('.btn-group')
        .append('<a href="" class="btn btn-default btnMinus"><span class="glyphicon glyphicon-minus"></span></a>')
        .append('<a href="" class="btn btn-default btnNew"><span class="glyphicon glyphicon-pencil"></span></a>')
        .append('<a href="" class="btn btn-default btnPlus"><span class="glyphicon glyphicon-plus"></span></a>');
    }
    if($(this).hasClass('btnNew')) {
        $(this)
        .closest('.form-group')
        .after('<div class="form-group ' + formGroupClass + '" data-clas="' + formGroupClass + '"></div>')
        .next()
        .append('<label for="" class="col-sm-2 control-label"></label>')
        .append('<div class="col-sm-4"></div>')
        .append('<div class="col-sm-2"></div>')
        .children('div.col-sm-4')
        .append('<input type="text" name="' + formGroupClass + '[]" class="form-control" placeholder="Adicionar novo equipamento">')
        .closest('.form-group')
        .children('div.col-sm-2')
        .append('<div class="btn-group" role="group" aria-label=""></div>')
        .children('.btn-group')
        .append('<a href="" class="btn btn-default btnMinus"><span class="glyphicon glyphicon-minus"></span></a>')
        .append('<a href="" class="btn btn-default btnNew"><span class="glyphicon glyphicon-pencil"></span></a>')
        .append('<a href="" class="btn btn-default btnPlus"><span class="glyphicon glyphicon-plus"></span></a>');

    }
});

You can see it working in this jsfiddle

Thanks in advance

Upvotes: 2

Views: 121

Answers (1)

Irvin Dominin
Irvin Dominin

Reputation: 30993

It's a simple typo you are searching data-class and setting data-clas attribute on new elements, change it and will work fine.

Code:

.after('<div class="form-group ' + formGroupClass + '" data-class="' + formGroupClass + '"></div>')

Demo: https://jsfiddle.net/cse87189/

Upvotes: 2

Related Questions