Ответ 1
Hallodorn ответ на Как временно отключить прокрутку? (что, на удивление, НЕ был принятым ответом) помогло.
У меня есть страница с разделом для рисования чертежа. Но события touchmove, по крайней мере, вертикальные, также прокручивают страницу (что ухудшает работу эскизов) при использовании ее в мобильном браузере. Есть ли способ: a) отключить и снова включить прокрутку страницы (чтобы я мог отключить ее, когда каждая строка запущена, а затем верните ее после завершения каждого) или b) отключите обработку по умолчанию (и, предположительно, прокрутку), которые идут на холст, нарисованный эскизом (я не могу просто полностью отключить их, поскольку их использует эскиз)?
Я использовал jquery-mobile vmouse обработчики для эскиза, если это имеет значение.
Обновить. На iPhone, если я выберем холст, который нужно нарисовать, или просто держите палец немного перед рисованием, страница не прокручивается, а не из-за чего-либо. закодированный на странице.
Hallodorn ответ на Как временно отключить прокрутку? (что, на удивление, НЕ был принятым ответом) помогло.
Задайте свойство touch-action CSS none
, которое работает даже с прослушиватели пассивных событий:
touch-action: none;
Применение этого свойства к элементу не приведет к возникновению поведения по умолчанию (прокрутки), когда событие происходит из этого элемента.
Примечание. Как указано в комментариях @nevf, это решение может больше не работать (по крайней мере, в Chrome) из-за изменений производительности. Рекомендуется использовать
touch-action
которое также предлагает ответ @JohnWeisz.
Подобно ответу @Llepwryd, я использовал комбинацию ontouchstart
и ontouchmove
чтобы предотвратить прокрутку, когда он находится на определенном элементе.
Взятые как есть из проекта моего:
window.blockMenuHeaderScroll = false;
$(window).on('touchstart', function(e)
{
if ($(e.target).closest('#mobileMenuHeader').length == 1)
{
blockMenuHeaderScroll = true;
}
});
$(window).on('touchend', function()
{
blockMenuHeaderScroll = false;
});
$(window).on('touchmove', function(e)
{
if (blockMenuHeaderScroll)
{
e.preventDefault();
}
});
По сути, то, что я делаю, это слушание касания начала, чтобы увидеть, начинается ли оно на элементе, который является дочерним по отношению к другому, используя jQuery .closest
и позволяя этому включать/выключать движение касания с помощью прокрутки. e.target
относится к элементу, с которого начинается сенсорный запуск.
Вы хотите запретить настройку по умолчанию для события сенсорного перемещения, однако вам также необходимо сбросить свой флаг для этого в конце сенсорного события, иначе никакие события сенсорной прокрутки не будут работать.
Это может быть выполнено без jQuery, однако для моего использования у меня уже был jQuery, и мне не нужно было что-то кодировать, чтобы определить, имеет ли элемент определенный родительский элемент.
Протестировано в Chrome на Android и iPod Touch по состоянию на 2013-06-18
В CSS есть немного "взлома", что также позволяет отключить прокрутку:
.lock-screen {
height: 100%;
overflow: hidden;
width: 100%;
position: fixed;
}
Добавление этого тела в тело предотвратит прокрутку.
document.addEventListener('touchstart', function(e) {e.preventDefault()}, false);
document.addEventListener('touchmove', function(e) {e.preventDefault()}, false);
Это должно предотвратить прокрутку, но оно также нарушит другие события касания, если вы не определите собственный способ их обработки.
попробуйте переполнение скрытой вещи, которую вы не хотите прокручивать, когда происходит событие touch. например, установите переполнение, скрытое в Start, и верните его в автоматическое завершение.
Вы попробовали? Мне было бы интересно узнать, будет ли это работать.
document.addEventListener('ontouchstart', function(e) {
document.body.style.overflow = "hidden";
}, false);
document.addEventListener('ontouchmove', function(e) {
document.body.style.overflow = "auto";
}, false);
Конечным решением будет установка overflow: hidden;
на document.documentElement
следующим образом:
/* element is an HTML element You want catch the touch */
element.addEventListener('touchstart', function(e) {
document.documentElement.style.overflow = 'hidden';
});
document.addEventListener('touchend', function(e) {
document.documentElement.style.overflow = 'auto';
});
Установив overflow: hidden
в начале касания, он делает все, что превышает скрытое окно, тем самым устраняя доступность, чтобы прокручивать что-либо (нет содержимого для прокрутки).
После touchend
блокировку можно освободить, установив overflow
в auto
(значение по умолчанию).
Лучше добавить это к <html>
, потому что <body>
может использоваться для создания стиля, плюс он может заставить детей вести себя неожиданно.
EDIT:
О touch-action: none;
- Safari не поддерживает его в соответствии с MDN.
Я обнаружил, что ev.stopPropagation();
работал на меня.