Ответ 1
Вызов preventDefault для события на самом деле правильный, но вы не хотите делать это для каждого компонента, так как это также предотвратит прокрутку в div (как вы упоминаете) и, например, скользящие по входам диапазона. Поэтому вам нужно добавить проверку обработчика ontouchmove, чтобы увидеть, касаетесь ли вы компонента, который разрешен для прокрутки.
У меня есть реализация, которая использует обнаружение класса CSS. Компоненты, которые я хочу разрешить касанием, просто присваивают класс.
document.ontouchmove = function (event) {
var isTouchMoveAllowed = false;
var p = event.target;
while (p != null) {
if (p.classList && p.classList.contains("touchMoveAllowed")) {
isTouchMoveAllowed = true;
break;
}
p = p.parentNode;
}
if (!isTouchMoveAllowed) {
event.preventDefault();
}
});