Вот 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');
});
Если вы поместите предупреждение в обработчик кликов, я имею в виду, например, во второй строке, работает ли оно? Я просто пытаюсь понять, в чем именно проблема. Это с обработчиком или с областью closest / toggleClass ..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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; помогает.
Попробуйте использовать touchstart вместо click ..