Подтвердить что ты не робот

JQuery - динамическая кнопка создания и прикрепление обработчика событий

Я хотел бы динамически добавлять элемент управления кнопки в таблицу с помощью jQuery и присоединять обработчик события клика. Я пробовал следующее, без успеха:

$("#myButton").click(function () {
    var test = $('<button>Test</button>').click(function () {
        alert('hi');
    });

    $("#nodeAttributeHeader").attr('style', 'display: table-row;');
    $("#addNodeTable tr:last").before('<tr><td>' + test.html() + '</td></tr>');
});

Вышеприведенный код успешно добавляет новую строку, но не позволяет правильно добавить кнопку. Как я могу выполнить это с помощью jQuery?

4b9b3361

Ответ 1

Вызов .html() сериализует элемент в строку, поэтому все обработчики событий и другие связанные данные теряются. Вот как я это сделаю:

$("#myButton").click(function ()
{
    var test = $('<button/>',
    {
        text: 'Test',
        click: function () { alert('hi'); }
    });

    var parent = $('<tr><td></td></tr>').children().append(test).end();

    $("#addNodeTable tr:last").before(parent);
});

Или

$("#myButton").click(function ()
{    
    var test = $('<button/>',
    {
        text: 'Test',
        click: function () { alert('hi'); }
    }).wrap('<tr><td></td></tr>').closest('tr');

    $("#addNodeTable tr:last").before(test);
});

Если вам не нравится передавать карту свойств в $(), вы можете вместо этого использовать

$('<button/>')
    .text('Test')
    .click(function () { alert('hi'); });

// or

$('<button>Test</button>').click(function () { alert('hi'); });

Ответ 2

Ваша проблема заключается в том, что вы конвертируете кнопку в фрагмент HTML, когда добавляете ее в таблицу, но этот фрагмент не является тем же объектом, что и тот, у которого на нем есть обработчик кликов.

$("#myButton").click(function () {
    var test = $('<button>Test</button>').click(function () {
        alert('hi');
    });

    $("#nodeAttributeHeader").css('display', 'table-row'); // NB: changed

    var tr = $('<tr>').insertBefore('#addNodeTable tr:last');
    var td = $('<td>').append(test).appendTo(tr);
});

Ответ 3

Быстрое исправление. Создать целую структуру tr > td > ; затем найдите кнопку внутри; приложить к нему событие; концевую фильтрацию цепи и вставить и вставить ее в дом.

$("#myButton").click(function () {
    var test = $('<tr><td><button>Test</button></td></tr>').find('button').click(function () {
        alert('hi');
    }).end();

    $("#nodeAttributeHeader").attr('style', 'display: table-row;');
    $("#addNodeTable tr:last").before(test);
});

Ответ 4

Вы можете использовать onclick внутри кнопки, чтобы гарантировать сохранение события, или присоединить обработчик нажатия кнопки, наведя кнопку после ее установки. Вызов test.html() не будет сериализовать событие.

Ответ 5

Вы просто добавили строку html. Не тот элемент, который вы создали с помощью прослушивателя событий щелчка.

Попробуйте следующее:

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
</head>
<body>
    <table id="addNodeTable">
        <tr>
            <td>
                Row 1
            </td>
        </tr>
        <tr >
            <td>
                Row 2
            </td>
        </tr>
    </table>
</body>
</html>
<script type="text/javascript">
    $(document).ready(function() {
        var test = $('<button>Test</button>').click(function () {
            alert('hi');
        });
        $("#addNodeTable tr:last").append('<tr><td></td></tr>').find("td:last").append(test);

    });
</script>