Отключить прокрутку в веб-приложении iPhone?
есть ли способ полностью отключить прокрутку веб-страницы в веб-приложении iPhone? Я пробовал много вещей, опубликованных в google, но ни один из них не работает.
вот моя текущая настройка заголовка:
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
document.body.addEventListener('touchmove', function(e){ e.preventDefault(); });
не работает.
9 ответов:
'self.объект WebView.представление ScrollView.отскоки = нет;'
просто добавьте эту строку в "viewDidLoad" mainViewController.m файл вашего заявления. вы можете открыть его в Xcode и добавить его .
Это должно сделать страницу без каких-либо резинок отскакивает все еще позволяет прокрутку в представлении приложения.
изменить на
touchstartсобытие вместоtouchmove. Под Один Палец События он говорит, что никакие события не отправляются во время кастрюли, так чтоtouchmoveможет быть слишком поздно.Я добавил слушателя в документ, а не тело.
пример:
document.ontouchstart = function(e){ e.preventDefault(); }
document.addEventListener('touchstart', function (e) { e.preventDefault(); });не используйте
ontouchmoveсвойство для регистрации обработчика событий, поскольку вы рискуете перезаписать существующий обработчик(ы) событий. Используйте addEventListener вместо этого (см. Примечание о IE на странице MDN).остерегайтесь, что предотвращение по умолчанию для
touchstartсобытиеwindowилиdocumentотключит прокрутку нисходящих областей.чтобы предотвратить прокрутку документа, но оставить все остальные события нетронутыми предотвратить по умолчанию для первого
touchmoveсобытие послеtouchstart:var firstMove; window.addEventListener('touchstart', function (e) { firstMove = true; }); window.addEventListener('touchmove', function (e) { if (firstMove) { e.preventDefault(); firstMove = false; } });причина, по которой это работает, заключается в том, что mobile Safari использует первый шаг, чтобы определить, прокручивается ли тело документа. Я понял это, разрабатывая более сложное решение.
в случае, если это когда-нибудь перестанет работать, более сложным решением является проверка
touchTargetэлемент и его родители и сделать карту направлений,которые могут быть прокручены. Тогда используйте первыйtouchmoveсобытие для определения направления прокрутки и просмотра, будет ли он прокручивать документ или целевой элемент (или любой из родителей целевого элемента):var touchTarget, touchScreenX, touchScreenY, conditionParentUntilTrue, disableScroll, scrollMap; conditionParentUntilTrue = function (element, condition) { var outcome; if (element === document.body) { return false; } outcome = condition(element); if (outcome) { return true; } else { return conditionParentUntilTrue(element.parentNode, condition); } }; window.addEventListener('touchstart', function (e) { touchTarget = e.targetTouches[0].target; // a boolean map indicating if the element (or either of element parents, excluding the document.body) can be scrolled to the X direction. scrollMap = {} scrollMap.left = conditionParentUntilTrue(touchTarget, function (element) { return element.scrollLeft > 0; }); scrollMap.top = conditionParentUntilTrue(touchTarget, function (element) { return element.scrollTop > 0; }); scrollMap.right = conditionParentUntilTrue(touchTarget, function (element) { return element.scrollWidth > element.clientWidth && element.scrollWidth - element.clientWidth > element.scrollLeft; }); scrollMap.bottom =conditionParentUntilTrue(touchTarget, function (element) { return element.scrollHeight > element.clientHeight && element.scrollHeight - element.clientHeight > element.scrollTop; }); touchScreenX = e.targetTouches[0].screenX; touchScreenY = e.targetTouches[0].screenY; disableScroll = false; }); window.addEventListener('touchmove', function (e) { var moveScreenX, moveScreenY; if (disableScroll) { e.preventDefault(); return; } moveScreenX = e.targetTouches[0].screenX; moveScreenY = e.targetTouches[0].screenY; if ( moveScreenX > touchScreenX && scrollMap.left || moveScreenY < touchScreenY && scrollMap.bottom || moveScreenX < touchScreenX && scrollMap.right || moveScreenY > touchScreenY && scrollMap.top ) { // You are scrolling either the element or its parent. // This will not affect document.body scroll. } else { // This will affect document.body scroll. e.preventDefault(); disableScroll = true; } });причина, по которой это работает, заключается в том, что mobile Safari использует первое сенсорное перемещение, чтобы определить, прокручивается ли тело документа или элемент (или любой из родителей целевого элемента) и придерживается этого решения.
Это должно работать. Нет больше серых областей в верхней или нижней части:)
<script type="text/javascript"> function blockMove() { event.preventDefault() ; } </script> <body ontouchmove="blockMove()">но это также отключает все прокрутки территории. Если вы хотите сохранить прокручиваемые области и по-прежнему удалить эффект резиновой ленты сверху и снизу, см. здесь:https://github.com/joelambert/ScrollFix.
отключить:
document.ontouchstart = function(e){ e.preventDefault(); }включить:
document.ontouchstart = function(e){ return true; }
document.ontouchmove = function(e){ e.preventDefault(); }на самом деле лучший выбор, который я узнал, он позволяет вам по-прежнему иметь возможность нажимать на поля ввода, а также перетаскивать вещи с помощью jQuery UI draggable, но он останавливает прокрутку страницы.
Я пробовал выше ответы и особенно Gajus, но никто не работает. Наконец, я нашел ответ ниже, чтобы решить проблему так, что только основной корпус не прокручивается, но другие разделы прокрутки внутри моего веб-приложения работают нормально. Просто установите положение фиксированное для вашего тела:
body { height: 100%; overflow: hidden; width: 100%; position: fixed; }
Comments