Показать сообщение отдельно
  #1 (permalink)  
Старый 05.07.2017, 13:50
Интересующийся
Отправить личное сообщение для AlexOk Посмотреть профиль Найти все сообщения от AlexOk
 
Регистрация: 02.11.2016
Сообщений: 20

DataTables jQuery, Row details
Доброго дня!
Использую datatables jquery у себя в проекте. У них есть удобная фича Row details (https://datatables.net/examples/serv...w_details.html)
когда при нажатии на + в строке открывается контейнер. Я переписал под свои нужды и теперь при нажатии на details открывается еще один datatables. Во второй таблице я так же реализовал row details и хочу, чтобы при нажатии открывалась третья таблица, но почему-то не получается сделать события клика уникальными для каждой из таблиц. То есть при нажатии на детали во второй таблице, срабатывает обработчик сначала нужный мне, а потом для первой таблицы.
Собственно как сделать два этих события уникальными для каждой из таблиц?
Привожу примеры кода, спасибо.

Контейнер для первой таблицы
<table  id="contracts" class="display" cellspacing="0" width=""</table>

Инициализация первой таблицы + обработчик mainTable.on('click')
$(document).ready(function() {

        'use strict';
        mainTable  = $('#contracts').DataTable({
            "iDisplayLength": 100,
            "autoWidth": false,
            "language": {
                "emptyTable": "Ошибка загрузки"
            },
            "ajax" : {
                "url" : "Servlet",
                "dataSrc" : "tenants",
                "type" : "POST"
            },
            columns: [
                {
                    "targets": 0,
                    "data": null,
                    "defaultContent": "<input  id = 'redact' type='image' onchange='' style='width: 30px;height: 30px;' src='images/edit.png' name='delete'>"
                },
                { title: "Имя"},
                { title: "Фамилия" },
                { title: "ID" },

                {
                    "targets": 0,
                    "data": null,
                    "defaultContent": "<input  id = 'delete' type='image' onchange='' style='width: 30px;height: 30px;' src='images/delete.png' name='delete'>"
                },
                {
                    "className":      'details-control',
                    "orderable":      false,
                    "data":           null,
                    "defaultContent": ''
                }
            ],
            "order": [[ 1, "asc" ]],
            "columnDefs": [
                {"className": "dt-left", "targets": "_all"}
            ]
        });
        mainTable.on('click', 'td.details-control', function () {
            var tr = $(this).closest('tr');
            var row = mainTable.row( tr );
            alert("ok contracts");
            if ( row.child.isShown() ) {
                row.child.hide();
                tr.removeClass('shown');
            }
            else
            {
                if ( mainTable.row( '.shown' ).length ) {
                    $('.details-control', mainTable.row( '.shown' ).node()).click();
                }
                var req = newXMLHttpRequest();
                var data = row.data();
                req.open("POST", "Servlet1", true);
                req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                req.send("id=" + data[3]);
                row.child( format(row.data()) ).show();
                tr.addClass('shown');
            }
        });
    });

При нажатии на +(details) срабатывает функция с инициализацией второй таблицы.
Формируем div в который поместим нашу таблицу

 function format () {
        var d = document.createElement('div');
        d.className='div_one';
        document.body.appendChild(d);
        $('.div_one').append('<table  id="events" class="display" cellspacing="0" width="100%"></table>');
        $('.div_one').append('<button style = "float:right;">Добавить договор</button>');


        if(eventTable!=null)
            eventTable.destroy();
        
        eventTable  = $('#events').DataTable({
            "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
                        $('td', nRow).css('background-color', '#879aa2');
            },
            "processing": true,
            "bLengthChange": false,
            "bFilter": false,
            "bInfo": false,
            "pagingType": "simple",
            "pageLength": 4,
            "paging": false,
            "autoWidth": false,
            "stateSave": true,
            "destroy" : true,
            "language": {
                "emptyTable": "Не загружено"
            },
            "ajax" : {
                "url" : "Servlet2",
                "dataSrc" : "data2",
                "type" : "GET"
            },
            columns: [
                { title: "1", visible: false },
                { title: "2" },
                { title: "3" },
                { title: "4"},
                { title: "5" },
                { title: "6" },
                { title: "7"},
                { title: "8", visible: false},
                { title: "9"},
                { title: "10"},
                {
                    "className":      'details-control',
                    "orderable":      false,
                    "data":           null,
                    "defaultContent": ''
                }
            ],
            "columnDefs":
                [
                    {"className": "dt-center", "targets": "_all"}
                ]
        });

        Второй обработчик, срабатывает но затем вызывается обработчик 
        для первой таблицы...
        
        eventTable.on('click', 'td.details-control', function () {
            alert("ok events");
        });

        return document.getElementsByClassName("div_one");
    }

Вообщем необходимо, что бы
eventTable.on('click', 'td.details-control', function () {
            alert("ok events");
        });

вызывался только для таблицы eventTable.
Ответить с цитированием