Передача аргумента

120
16 декабря 2020, 06:10

Делаю небольшую вебморду для управления своим VPN сервером на Flask'е, с js знаком лишь слегка и битый час пытаюсь сделать так, чтобы можно было передать id элемента на который был клик (есть таблица, через кнопку можно удалять строки, отправив post запрос на сервер с id элемента, пред этим вылетает модальное окно для подтверждения действия)

function confirmModal(callback){
    $('#ConfirmModal').modal('show');
    $('#ConfirmModal-no').on('click',  function () {
        callback(false);
        $('#ConfirmModal').modal('hide');
    });
    $('#ConfirmModal-ok').on('click',  function () {
        callback(true);
        $('#ConfirmModal').modal('hide');
    });
}

function send_request(some_id){
    $.post('/remove_user', {'user_target': some_id});
}

$('.confirm_remove').on("click", function () {
    var caller_id = this.id;
    confirmModal(function (result) {
        if (result){
            send_request(caller_id)
        }
    })
});

Собственно, я перепробовал много вариаций, но так и не понял каким костылем можно передать caller_id функции send_request, не прибегая к глобальным переменным.

UPD: Все-таки сумел передать аргумент + избавился от дублирования обработчиков (спасибо за замечание от Anton Shchyrov) с помощью .one()

function confirmModal(callback, id){
    $('#ConfirmModal').modal('show');
    $('#ConfirmModal-no').one('click',  function () {
        callback(false, id);
        $('#ConfirmModal').modal('hide');
    });
    $('#ConfirmModal-ok').one('click',  function () {
        callback(true, id);
        $('#ConfirmModal').modal('hide');
    });
}

function send_request(some_id){
    $.post('/remove_user', {'user_target': some_id});
}

$('.confirm_remove').on("click", function () {
    var caller_id = this.id;
    confirmModal(function (result, id) {
        if (result){
            send_request(id)
        }
    }, caller_id)
});
Answer 1

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

Я не знаю, что это за метод modal и нужно смотреть документацию по нему, как через него передать данные. Как вариант, использовать $("#ConfirmModal").data()

function confirmModal(id) {
  $('#ConfirmModal').data({id: id}).modal('show');
}
$('#ConfirmModal-no').on('click', function() {
  $('#ConfirmModal').modal('hide');
});
$('#ConfirmModal-ok').on('click', function() {
  $('#ConfirmModal').modal('hide');
  const id = $('#ConfirmModal').data('id');
  send_request(id);
});
function send_request(some_id) {
  $.post('/remove_user', {'user_target': some_id});
}
$('.confirm_remove').on("click", function() {
  confirmModal(this.id)
});
READ ALSO
как удалить кнопкой мыши элемент li?

как удалить кнопкой мыши элемент li?

мне нужно по нажатию лкм на выбранный элемент li его удалить, а следующий элемент встал на место удаленного

137
Отображение сайта

Отображение сайта

Когда открываю сайт напрямую, то все хорошо работает(скриншот 1), слайдер исправен, аккордеон открывается, НО как только я открываю сайт через...

111
Как создать файл css в intellij idea community edition?

Как создать файл css в intellij idea community edition?

Как создать файл css в intellij idea community edition?его просто нету во вкладке добавить

233
Подсказка по клику на элемент в SVG-файле

Подсказка по клику на элемент в SVG-файле

Есть SVG-карта страны с разбивкой по областямКаждая область это polygon

122