IOS: отключить прокрутку отказов, но разрешить обычную прокрутку - программирование
Подтвердить что ты не робот

IOS: отключить прокрутку отказов, но разрешить обычную прокрутку

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

Общеизвестное решение javascript, которое я вижу повсюду, таково:

$(document).bind(
   'touchmove',
   function(e) {
     e.preventDefault();
   }
);

Но это предотвращает прокрутку целиком. Есть ли способ просто удалить отскок. Предпочтительно использовать CSS или метатег в отличие от JS, но все, что работает, будет делать.

4b9b3361

Ответ 1

Мне нужно добавить еще один ответ. Мой первый подход должен работать, но есть ошибка iOS, которая по-прежнему несут всю страницу, даже если e.stopPropagation.

mikeyUX найти обходное решение для этого: fooobar.com/questions/69833/... Интересно, почему он просто получил несколько кликов за эту замечательную идею...

Вот как я использовал свой подход в моем случае:

var content = document.getElementById('scrollDiv');
content.addEventListener('touchstart', function(event) {
    this.allowUp = (this.scrollTop > 0);
    this.allowDown = (this.scrollTop < this.scrollHeight - this.clientHeight);
    this.slideBeginY = event.pageY;
});

content.addEventListener('touchmove', function(event) {
    var up = (event.pageY > this.slideBeginY);
    var down = (event.pageY < this.slideBeginY);
    this.slideBeginY = event.pageY;
    if ((up && this.allowUp) || (down && this.allowDown)) {
        event.stopPropagation();
    }
    else {
        event.preventDefault();
    }
});

Ответ 2

Отключить отскакивание, предотвращая поведение документа по умолчанию:

document.addEventListener("touchmove", function(event){
    event.preventDefault();
});

Разрешить прокрутку, не допуская, чтобы касание достигло уровня документа (там, где вы могли бы предотвратить прокрутку):

var scrollingDiv = document.getElementById('scrollDiv');
scrollingDiv.addEventListener('touchmove', function(event){
    event.stopPropagation();
});

Обратите внимание на разницу между этими двумя:

event.stopPropagation()
event.preventDefault()

StopPropagation должен быть вашим выбором здесь! Вот очень хорошее объяснение: http://davidwalsh.name/javascript-events

Изменить: Такая же проблема, такое же решение: document.ontouchmove и прокрутка на iOS 5

Edit2: фиксированная опечатка в именах переменных добавлены скобки после методов

Ответ 3

Если применимо к Desktop Browser, не нужно никаких кодов JavaScript, всего несколько строк CSS-кодов:

html {
    height  : 100%;
    overflow: hidden;
}
body {
    height  : 100%;
    overflow: auto;
}

Ответ 4

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

noBounce.init({   
    animate: true
});

Если вы хотите предотвратить переключение только на один элемент, а не на всю страницу, вы можете сделать это так:

 noBounce.init({
    animate: true,
    element: document.getElementById("content")
  }); 

Ответ 5

Я попробовал много разных подходов, которые я нашел здесь, в stackoverflow, но iNoBounce - это то, что действительно сработало для меня: https://github.com/lazd/iNoBounce

Я просто включил его в свой index.html:

<script src="inobounce.js"></script>

Ответ 6

Нашел код, который работал со мной, я считаю, что он сработает.

Решение написано здесь: http://apdevblog.com/optimizing-webkit-overflow-scrolling/

В принципе, вам нужен этот js-код:

    document.addEventListener("DOMContentLoaded", ready, false);
    document.addEventListener("touchmove", function (evt)
    {
        evt.preventDefault();
    }, false);

    function ready()
    {
        var container = document.getElementsByClassName("scrollable")[0];
        var subcontainer = container.children[0];
        var subsubcontainer = container.children[0].children[0];

        container.addEventListener("touchmove", function (evt)
        {
            if (subsubcontainer.getBoundingClientRect().height > subcontainer.getBoundingClientRect().height)
            {
                evt.stopPropagation();
            }
        }, false);
    }

И тогда у вас есть прокручиваемые div с class= "прокручиваемым".