有些网页使用了 iPhone 的向左和向右滑动功能,以拉出菜单。 现在随着 iOS7 的推出,可以通过向左或向右滑动屏幕来实现浏览器历史记录中的上一页或下一页。
但是,是否有一种方法可以针对特定的页面禁用此功能,以避免滑动操作的冲突行为?
有些网页使用了 iPhone 的向左和向右滑动功能,以拉出菜单。 现在随着 iOS7 的推出,可以通过向左或向右滑动屏幕来实现浏览器历史记录中的上一页或下一页。
但是,是否有一种方法可以针对特定的页面禁用此功能,以避免滑动操作的冲突行为?
你无法直接禁用它,但只有当浏览器历史记录中存在内容时,本地滑动返回才会发生。
这种方法并不适用于所有情况,但如果你在新标签页中打开了一个单页面 web 应用程序,则可以通过使用以下方法防止其添加到历史记录:
window.history.replaceState(null, null, "#" + url)
使用 pushState 的替代方案或
document.location.hash = url
html, body {
overscroll-behavior-x: none;
}
2) Safari的JavaScript修复
if (window.safari) {
history.pushState(null, null, location.href);
window.onpopstate = function(event) {
history.go(1);
};
}
touchmove
事件检测滑动手势,并仅在该手势不是紧接着立即执行时才执行上述代码。这应该是可行的。 - Šime Vidasoverscroll-behavior-x: none;
,但它对滑动导航行为没有影响。在左边缘向右滑动会返回(即使这是选项卡历史记录中的第一页,它仍然会返回到主屏幕)。 - naktiniswindow.addEventListener('touchstart', e => e.preventDefault(), { passive: false })
passive
标志很重要!
我发现它还会禁用悬停时的放大镜功能,可能还会影响其他Safari特定的事件。
编辑:这个监听器会导致其他onclick
事件监听器无法正常工作...
document.body.addEventListener('click', function(evt) {
const a = evt.target.closest('a:not([href^="#"])');
if (!a) { return; }
evt.preventDefault();
history.replaceState({ }, '', a.href);
location.reload();
});