注意:正如@nevf 在评论中指出的那样,由于性能变化,此解决方案可能不再有效(至少在 Chrome 中)。建议使用touch-action
@JohnWeisz 的回答也建议使用。
与@Llepwryd 给出的答案类似,我使用ontouchstart
和的组合ontouchmove
来防止在某个元素上滚动。
照原样取自我的一个项目:
window.blockMenuHeaderScroll = false;
$(window).on('touchstart', function(e)
{
if ($(e.target).closest('#mobileMenuHeader').length == 1)
{
blockMenuHeaderScroll = true;
}
});
$(window).on('touchend', function()
{
blockMenuHeaderScroll = false;
});
$(window).on('touchmove', function(e)
{
if (blockMenuHeaderScroll)
{
e.preventDefault();
}
});
本质上,我正在做的是监听触摸开始,看看它是否从一个元素开始,该元素是另一个使用 jQuery 的子元素,.closest
并允许打开/关闭滚动的触摸运动。指的e.target
是触摸开始的元素。
您想阻止触摸移动事件的默认设置,但是您还需要在触摸事件结束时为此清除标志,否则触摸滚动事件将不起作用。
这可以在没有 jQuery 的情况下完成,但是对于我的使用,我已经有了 jQuery,并且不需要编写代码来查找元素是否具有特定的父级。
截至 2013 年 6 月 18 日,在 Android 和 iPod Touch 上的 Chrome 中进行了测试