Закрытие div при нажатии вне div не работает на iPhone. Прекрасно работает на Mac / ПК и Android

Вот div (s). В зависимости от того, какая кнопка нажата, одна из них появится на экране.

var box;
var value;
var wrapper = $('.wrapper');

$('body').on('click', '#login, #register', function() {
  if ($(this).attr('class')) {
    value = $(this).attr('class')
  } else {
    value = $(this).attr('id')
  }
  switch (value) {
    case 'login':
      box = $('.loginBox');
      break;
    case 'register':
      box = $('.registerBox');
      break;
  }

  box.closest(wrapper).toggleClass('open');
  $('input:text', box).first().focus();
});

// this successfully closes the div when I click outside of it (on Mac/PC & Android, however it does not close the div on iOS)
$('body').on('click', '.wrapper', function() {
  box.closest(wrapper).toggleClass('open');
});
$('body').on('click', '.wrapper div', function(e) {
  e.stopPropagation();
});
.wrapper {
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  background: rgba(0, 0, 0, 0.1);
  display: none;
  z-index: 300;
}

.open {
  display: block;
}

.blackBox {
  position: absolute;
  left: 50%;
  top: 41%;
  height: 340px;
  width: 500px;
  z-index: 997;
  margin: 0 auto;
  transform: translate(-50%, -50%);
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper">
  <div class = "blackBox">
    <div class = "loginBox">
      ...
    </div>
  </div>
</div>

<div class = "wrapper">
  <div class = "blackBox">
    <div class = "registerBox">
      ...
    </div>
  </div>
</div>

Вторая функция (переключатель при нажатии за пределами div) успешно закрывает div, когда я нажимаю за его пределами (на Mac / ПК и Android, однако он не закрывает div на iOS)

Есть ли другой метод, который я могу использовать для iOS ?:

$('body').on('click', '.wrapper', function(){
      if (/iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {
          // another method
      }
    box.closest(wrapper).toggleClass('open');
});

Попробуйте использовать touchstart вместо click ..

Chandra Kumar 30.07.2018 12:28

Если вы поместите предупреждение в обработчик кликов, я имею в виду, например, во второй строке, работает ли оно? Я просто пытаюсь понять, в чем именно проблема. Это с обработчиком или с областью closest / toggleClass ..

Mosh Feu 30.07.2018 12:40
Поведение ключевого слова "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) для оценки ваших знаний,...
3
2
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

iStuff подтвердит событие click, только если элемент доступен для щелчка. Одно из условий сделать его кликабельным - дать ему

cursor:pointer;

Если это не вариант, вы можете использовать tap:

$(containerSelector).on('click tap', targetSelector, function(event) {
  // have you finished that webpage already?
})

Еще один вариант - использовать touchstart. Но лично я считаю, что это ошибка. touchstart запускается всякий раз, когда запускается событие touch, будь то провести, мультисенсорный зум или любые другие причудливые жесты, которые ваше устройство может распознать.

В большинстве случаев, когда вы хотите пролистывать, панорамировать, масштабировать, вы не хотите, чтобы функция щелчка запускалась. tap - самое кликабельное событие в мире сенсорных жестов.

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

Спасибо! .on('click tap') на самом деле не работал у меня, но cursor:pointer; помогает.

Zorgan 30.07.2018 12:58

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