Поиск по этому блогу

суббота, 5 января 2013 г.

"Вы точно хотите удалить..." или Unified confirmation dialog

В UI хорошей практикой является переспрашивать пользователя когда он намерен выполнить какое-либо необратимое или опасное/нежелательное действие - удалить контакт, поставить Яндекс Бар, подписаться на блог Джастина Бибера... и призвано уберечь пользователя от последствий "случайного клика".
Реализация подобных сообщений не составляет большого труда, и у меня не вызвала, однако случилось так что при развитии проекта количество кода отвечающего лишь за подобного рода сообщения выросло до нежелательных размеров, да и интернационализацию подтягивать с яваскрипта не очень приятно. Решил упростить себе жизнь и написать универсальный обработчик таких сообщений, что с этого вышло смотрите сами.


Начнем с ТЗ : по клику на элемент с определенным классом (пусть будет need-confirmation) вывести пользователю сообщение (будем хранить его в атрибуте title нашего элемента) и предотвратить дальнейшее всплывание события и его поведение по умолчанию (переход по ссылке для элементов <a>). При получении подтверждения запустить обработчики событий для данного элемента и выполнить действие по умолчанию для ссылок.

<!doctype html>
<html>
<head>
  <title>Unified confirmations</title>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script>
  $(document).ready(function () {
      $('.need-confirm').on('click', function (e) {
          var self = $(this);
          if (!self.data('confirmed')){
              e.stopImmediatePropagation();
              e.preventDefault();
              // Simulate confirmation by any dialog type (jquery ui for example)
              setTimeout(function () {
                  if (confirm(self.attr('title'))){
                      self.data('confirmed', true);
                      self.trigger($.Event('click')); // Trigger another handlers and default handlers i.e. form submition ... 
                      if (self.prop('href')) { // but if this a link
                          var target = (self.prop('target') || '_self').replace(/^_/, '').toLowerCase();
                          if (target == 'blank') {
                              window.open(self.prop('href'));
                          } else {
                              if (window.frames[target]) {
                                  window.frames[target].location = self.prop('href');
                              } else {
                                  window.open(self.prop('href'), 'target');
                              }
                          }
                      }
                  }
              }, 500);
              return false;
          }
          self.data('confirmed', false);
          return true;
      });
      $('a').on('click', function () {
         $('body').append('Handler on ' + this.href + ' target ' + this.target + '</br>');
      });
  });
  </script>
</head>
<body>
  <a href="http://google.com" target="_blank" class="need-confirm" title="Create new window with google?">Test</a>
  <a href="#porno-site" target="_top" class="need-confirm" title="Open porno site ?">Test</a>
  <a href="http://www.msn.com/" target="my_frame" class="need-confirm"r title="Looking for bad ass ?">Test</a>
  <a href="#regular-test" class="need-confirm">Test</a>
</body>
</html>

В заключение скажу, что навешивать такой обработчик необходимо первым так как он не сможет остановить обработчики которые были навешаны раньше его.

Комментариев нет:

Отправить комментарий