注意:正如@nevf 在评论中指出的那样,由于性能变化,此解决方案可能不再有效(至少在 Chrome 中)。建议使用touch-action
@JohnWeisz's answer也建议使用的。
与@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 中测试