禁用iPhone Web应用程序中的滚动?
有没有什么办法可以完全禁用iPhone网页应用程序的网页滚动? 我已经尝试过在谷歌上发布大量的东西,但似乎没有工作。
这是我目前的标题设置:
<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(); });
似乎没有工作。
'self.webView.scrollView.bounces = NO;'
只需在应用程序的mainViewController.m文件的“viewDidLoad”中添加这一行即可。 你可以在Xcode中打开它并添加它。
这应该使页面没有任何橡皮筋反弹仍然在应用程序视图中启用滚动。
更改为touchstart
事件而不是touchmove
。 在一个手指事件下,它表示在平移过程中不发送任何事件,所以touchmove
可能为时已晚。
我将侦听器添加到文档中,而不是正文。
例:
document.ontouchstart = function(e){ e.preventDefault(); }
document.addEventListener('touchstart', function (e) { e.preventDefault(); });
不要使用ontouchmove
属性来注册事件处理程序,因为您有可能覆盖现有的事件处理程序。 改用addEventListener (请参阅MDN页面上有关IE的注意事项)。
请注意,防止window
或document
上的touchstart
事件的默认值将禁止滚动下降的区域。
要防止文档滚动,但保持所有其他事件不变,请防止touchmove
的第一个touchmove
事件的默认值:
var firstMove; window.addEventListener('touchstart', function (e) { firstMove = true; }); window.addEventListener('touchmove', function (e) { if (firstMove) { e.preventDefault(); firstMove = false; } });
这个原因是因为移动Safari正在使用第一步来确定文档正文是否正在滚动。 我已经意识到这一点,同时devise一个更复杂的解决scheme。
如果这样做会停止工作,更复杂的解决scheme是检查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; } });
这个原因起作用的原因是,移动Safari使用第一个触摸动作来确定文档正在滚动还是元素(或目标元素父项),并坚持这一决定。
如果你使用的是jQuery 1.7+,这个效果很好:
$("donotscrollme").on("touchmove", false);
这应该工作。 没有更多的灰色地带在顶部或底部:)
<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(); }
实际上是我发现的最好的select,它允许你仍然能够点击input字段,以及拖动使用jQuery UI可拖动的东西,但它停止滚动页面。
我试过以上的答案,特别是Gajus的,但没有任何作品。 最后,我find了下面的答案来解决这个问题,只有主体不滚动,但我的networking应用程序内的其他滚动部分都工作正常。 简单地设置为您的身体固定的位置:
body { height: 100%; overflow: hidden; width: 100%; position: fixed; }