iOS 8上的自定义JavaScript滚动-可能吗?

iOS 8上的自定义JavaScript滚动-可能吗?,javascript,jquery,ios,Javascript,Jquery,Ios,我正在为iOS8构建一个页面,我需要完全阻止内置的滚动,并单独通过javascript滚动页面,例如使用scrollTo方法 我不想隐藏滚动条,只是为了阻止滚动动作,看起来它是通过event.preventDefault完成的,并在JavaScript中实现滚动 这可以做到吗?几年前,我用手机制作了一个cordova/phonegap应用程序。当时它帮助我解决了一些严重的滚动视图问题 您可以禁用滚动、强制移动等 也许这对你有用 JavaScript有一个,不幸的是它不可取消,即event.pre

我正在为iOS8构建一个页面,我需要完全阻止内置的滚动,并单独通过javascript滚动页面,例如使用scrollTo方法

我不想隐藏滚动条,只是为了阻止滚动动作,看起来它是通过event.preventDefault完成的,并在JavaScript中实现滚动


这可以做到吗?

几年前,我用手机制作了一个cordova/phonegap应用程序。当时它帮助我解决了一些严重的滚动视图问题

您可以禁用滚动、强制移动等

也许这对你有用

JavaScript有一个,不幸的是它不可取消,即event.preventDefault不起作用

但是,如果您仅使用支持触摸的设备,并且通过触摸完成滚动,则将在滚动时触发,这是可取消的,使用event.preventDefault,并将阻止滚动。请注意,这还可以防止其他需要touchmove的操作,例如缩放

另一种解决方案(在某些设备上可能看起来有点浮躁)是将文档的滚动位置存储在您想要锁定它的位置,并在用户滚动时转到这些坐标。如下所示:

var locked = false,
    posX = 0,
    posY = 0;

var lock = function(){
    //assign the current coordinates to the position variables
    var doc = document.documentElement;
    posX = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
    posY = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

    locked = true;
};
var unlock = function(){
    locked = false;
};

document.addEventListener('scroll', function(e){
    if(locked)
        scrollTo(posX, posY);
});

嗨@Kiren你能详细说明一下你的上一个解决方案吗?我没有完全理解它;我应该在什么时候存储文档的滚动位置?顺便说一句,谢谢你的回复。滚动位置就是你想要锁定文档的位置。这是一个非常好的例子,但我需要能够在JS中实现滚动,一旦它被锁定,滚动将始终被锁定。就像您最初提到的touchmove事件允许event.preventDefault;我想那可能是我唯一的出路。无论如何谢谢你!只要在浏览JS之前更改posX和posY,它就可以正常工作。但我认为使用touchmove事件是一种更安全的选择,因为我在使用其他解决方案的移动设备上遇到口吃。我确实发现,在阻止touchmove事件后,我可以实现滚动位置的自定义移动,因此我将专注于这方面的解决方案。我会将此标记为正确答案,谢谢@Kiren!谢谢遗憾的是,使用iScroll不是一个选项。我只需要它在iOS 8上工作。特别是为了在滚动/滑动期间避开设备重新绘制和javascript执行之间的间隙/延迟。即使使用iOS 8,滚动期间的javascript执行也不是100%无缝的;换言之,如果我在滚动时移动屏幕上的某个内容,它将始终有轻微的延迟。我有一个使用剪辑矩形的工作示例,我正在onscroll处理程序中移动它;这将是一个完美的例子。是的,这将是伟大的,让我知道当你完成你的例子,所以我可以帮助你进一步!这已经做了很长一段时间了,lotsa头疼:在那里我试图重新定位一个剪辑:矩形区域在一个位置:固定的div与图像背景。重新定位是在我尝试过的onscroll事件处理程序SetInterval、touchmove事件中完成的,结果相同。桌面上的动画是无缝/平滑的,但在桌面上有延迟iOS@Sonofkyuss基于您的示例,我想知道为什么不使用CSS来实现这一点?这将解决后期重新喷漆的问题。我只是在文本中添加了背景色,在没有任何javascript的情况下得到了相同的结果,