Alovinglol
@Alovinglol
front-end developer

Как получить ответ с fancybox?

При определённых событиях пользователю нужно выводить модальное окно fancybox в котором дать пользователю выбор "Да" и "Нет" и нужно получить то что он нажал.
Можно повесить события на кнопки "Да"и "Нет", но это не то что нужно.
  • Вопрос задан
  • 346 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Я обычно делаю собственные alert и confirm, которые выводят сообщения в модальных окнах.

Для обработки закрытия можно использовать либо функции обратного вызова, либо Promise.

Использование с Promise выглядит так:

Confirm("Да или Нет?").then((result) => {
  if (result) {
    console.log("Пользователь согласен на всё.");
  }
  else
  {
    console.log("Пользователь что-то подозревает.");
  }
});

Внутри все равно без обработчиков не обойтись, но если функция вызова окна будет одна, то это не критично:

function Confirm(message) {
  let p = new Promise((resolve, reject) => {
    // тут код создания окна
    // $.fancybox({ 
    //   modal: true,
    //   content: '<div>' + message + '</div>'
    // });
    // в обработчики кнопок нужно добавить вызов resolve
    // true - если пользователь нажал Ok
    // resolve(true);
    // false - если пользователь нажал Отмена
    // resolve(false);
  });

  return p;
}

При желании, можно сделать свой аналог Promise, хотя смысла нет, готовый вполне пригоден для решения подобной задачи.

Вот более полный рабочий пример:

function Confirm(message) {
  return new Promise(function(resolve, reject) {
    var buttons = $('<div class="buttons" />');
    var btnOk = $('<button class="btn btn-default">Ok</button>');
    var btnCancel = $('<button class="btn btn-default">Отмена</button>');
    var content = $('<div />');

    btnOk.click(function() { 
      resolve(true);
      $.fancybox.close(); 
    });
    
    btnCancel.click(function() { 
      resolve(false); 
      $.fancybox.close();
    });

    content.append('<div class="message" />');
    content.append('<hr />');
    content.append(buttons);
    
    $('.message', content).html(message);
    
    buttons.append(btnOk);
    buttons.append(' ');
    buttons.append(btnCancel);
    
    $.fancybox({ 
       modal: true,
       content: content
    });
  });
}

Confirm('Вы согласны с этим решением?').then(function(result) {
  if (result) {
    $('body').append("<h1>Отлично!</h1>");
  }
  else  {
    $('body').append("<h1>Очень жаль...</h1>");
  }
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
iiiBird
@iiiBird
Пока ты спишь - твой конкурент совершенствуется
ну да. не вешай события на кнопки. узнавай экстросенсорно, что нажал пользователь)
Ответ написан
@Fractalzombie
Software Engineer
Ну можно написать свой ивент менеджер, который будет сохранять события при нажатии чего либо и если нужно выполнять их. Допустим я недавно решал проблему Google Analytics + Yandex Metrika при нажатии, открытии чего либо или при других событиях. Я написал расширяемый EventManager на typescript и теперь можно добавить туда не только Google,Yandex евенты, а любые отнаследованные от интерфейса ивенты. Сохранял их в localStorage или cookie в серилизованном виде. Могу поделиться кодом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы