Слушатель событий исчезает после действия ajax и возвращается после обновления

У меня есть два действия, которые обрабатываются Ajax: одно - удалить, а другое - отменить удаление.

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

Я проверил кнопку отмены-удаления после действия удаления, в котором нет Event listener, после обновления страницы появляется Event listener и начинает работать нормально.

Вот код PHP.

@foreach($productCategories as $productCategory)
                            <tr class = "item{{ $productCategory->id }}">
                                <td><strong>{!! $productCategory->name !!}</strong></td>
                                <td class = "text-center">
                                    <button class = "edit-modal btn btn-info" data-id = "{{ $productCategory->id }}"
                                            data-name-ar = "{{ $productCategory->translate('ar')->name }}"
                                            data-name-en = "{{ $productCategory->translate('en')->name }}">
                                        <span class = "fa fa-pencil-square-o"></span> Edit
                                    </button>
                                    @if ($productCategory->soft_delete == 0)
                                        <button class = "delete-modal btn btn-danger"
                                                data-id = "{{ $productCategory->id }}"
                                                data-name-ar = "{{ $productCategory->translate('ar')->name }}"
                                                data-name-en = "{{ $productCategory->translate('en')->name }}">
                                            <span class = "fa fa-trash"></span> Delete
                                        </button>
                                    @else
                                        <button class = "btn btn-warning undo-delete"
                                                id = "{{ $productCategory->id }}"
                                                data-name-ar = "{{ $productCategory->translate('ar')->name }}"
                                                data-name-en = "{{ $productCategory->translate('en')->name }}">
                                            <span class = "fa fa-undo"></span> Undo Delete
                                        </button>
                                    @endif
                                </td>
                            </tr>
                        @endforeach

и вот действие для удаления

/ Действие при нажатии кнопки удаления /

$('.modal-footer').on('click', '.delete', function () {
        $.ajax({
            url: 'delete-product-category',
            type: 'post',
            data: {
                '_token': $('input[name=_token]').val(),
                'id': $('.category-id').text(),
                'soft_delete': 1
            },
            success: function (data) {
                let arabic_name = data.translations[0].name;
                let english_name = data.translations[1].name;

                $('.item' + data.id).replaceWith("<tr class='item" + data.id + "'><td><strong>" + arabic_name + "</strong></td><td class='text-center'><button class='edit-modal btn btn-info' data-id='" + data.id + "' data-name-ar='" + arabic_name + "' data-name-en='" + english_name + "'><span class='fa fa-pencil-square-o'></span> Edit</button> <button class='btn btn-warning undo-delete' id='" + data.id + "' data-name-ar='" + arabic_name + "' data-name-en='" + english_name + "'><span class='fa fa-undo'></span> Undo Delete</button></td></tr>");
            },
        });
    });

и действие для отмены удаления

/ Действие на кнопку отмены-удаления /

$('.undo-delete').on('click', function () {
            $.ajax({
                url: 'undo-delete-product-category',
                type: 'post',
                data: {
                    '_token': $('input[name=_token]').val(),
                    'id': $(this).attr('id'),
                    'soft_delete': 0
                },
                success: function (data) {
                    let arabic_name = data.translations[0].name;
                    let english_name = data.translations[1].name;

                    $('.item' + data.id).replaceWith("<tr class='item" + data.id + "'><td><strong>" + arabic_name + "</strong></td><td class='text-center'><button class='edit-modal btn btn-info' data-id='" + data.id + "' data-name-ar='" + arabic_name + "' data-name-en='" + english_name + "'><span class='fa fa-pencil-square-o'></span> Edit</button> <button class='delete-modal btn btn-danger' data-id='" + data.id + "' data-name-ar='" + arabic_name + "' data-name-en='" + english_name + "'><span class='fa fa-trash'></span> Delete</button></td></tr>");
                },
            });
        });

Вам необходимо использовать делегированный обработчик событий на .undo-delete, точно так же, как вы уже делаете это для .delete.

Rory McCrossan 11.12.2018 11:57

@RoryMcCrossan Спасибо за быстрый ответ, но мне нужно это понять, так как я новичок в Ajax, вы имеете в виду delegated, как удалить, как $('.undo-delete').on('click', '.undo-delete', function () {, это правильно?

Yousef Altaf 11.12.2018 12:02
$('.modal-footer').on('click', '.undo-delete', function () {
Rory McCrossan 11.12.2018 12:07

Ага, но .modal-footer больше нет, когда появляется модальное окно delete, и в нем есть .modal-footer, но при отмене удаления нет .modal-footer.

Yousef Altaf 11.12.2018 12:10

Затем используйте статического родителя более высокого уровня.

Rory McCrossan 11.12.2018 12:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
16
0

Другие вопросы по теме