停止镀铬后退/前进两个手指滑动

and*_*rei 9 javascript google-chrome swipe

我想禁用导致Chrome返回或前进的两个手指滑动.我有一个网站,如果他没有专门保存,用户可能会失去工作进度.

我尝试过使用,window.onbeforeunload但如果我在网址中有哈希值,那么这似乎不起作用(后退将在www.example.com/work/#step1#unsaved www.example.com/work/#step0之间发生变化)事件似乎没有触发.

我正要切换到另一种解决方案,但今天我注意到在Google Docs中它完全禁用了.他们是怎么做到的?

red*_*tan 9

默认情况下,在新选项卡/窗口中打开特定页面(通过在超链接中放置target ="_ blank">).这样就没有以前的页面可以回去了.

或者默认情况下防止水平滚动.为此,您可以使用jquery.mousewheel执行:

$(document).on("mousewheel",function(event,delta){ 
  // prevent horizontal scrolling
  if (event.originalEvent.wheelDeltaX !== 0) {
    event.preventDefault();
  } 
});
Run Code Online (Sandbox Code Playgroud)

  • @sheerun 不,不是。stopPropagation 会终止可能导致意外行为和依赖于这些事件被触发的第三方代码中的错误的事件。总是更喜欢 preventDefault。此外,在 Chrome 59.0.3071.115 中,对于这种情况, preventDefault 似乎不再起作用(stopPropagation 也没有)。有没有人有解决方案? (2认同)

小智 7

禁用Chrome两指向后/向前滑动

这为我工作:

body {
  overscroll-behavior-x: none;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果这对您不起作用,请尝试在“html”元素上指定“overscroll-behavior-x”。 (4认同)
  • 如果您只想在某些元素中使用此属性,例如“<canvas>”,则需要“addEventListener('mouseenter'/'mouseleave'`”并在​​“<html>”上附加/删除该类 (2认同)

nab*_*own 7

假设您有一个水平滚动元素,添加overscroll-behavior-x: contain;是防止滚动操作溢出到页面并导致导航的最简单方法。

https://dev.to/danburzo/css-micro-tip-prevent-history-navigation-on-horizo​​ntally-scrolling-elements-3iil

https://caniuse.com/#feat=css-overscroll-behavior


use*_*574 6

禁用或替换Google Chrome 61的滑动手势

导致我在这里出现的问题被标记为“重复”,并且无法回答。我认为此答案更适合“重复”的问题,但是,我认为此答案可能会为落在这两个问题上的人节省时间。

更好的问题: 在JavaScript中的Chrome浏览器上禁用导航滑动

谷歌开发人员的这篇文章帮助我允许e.preventDefault()正常工作,并防止Chrome 61以后的滑动手势。

https://developers.google.com/web/updates/2017/01/scrolling-intervention

givanse对以下问题的回答是我用来编写自己的滑动事件处理程序的代码:

通过iPhone和Android上的JavaScript检测手指滑动

总之,以下两个事件用于实现划动手势:

handleTouchStart (e) {
  ...
},
handleTouchMove (e) {
  ...
  e.preventDefault()
}
Run Code Online (Sandbox Code Playgroud)

从Chrome 56开始,默认行为是使事件监听器变为被动状态,从而禁用阻止Chrome滑动手势的功能。要覆盖此行为,可以按如下方式添加事件侦听器:

document.addEventListener(
  'touchstart',
  this.handleTouchStart,
  {passive: false}
)
document.addEventListener(
  'touchmove',
  this.handleTouchMove,
  {passive: false}
)
Run Code Online (Sandbox Code Playgroud)

通过将{passive:false}对象作为第三个参数传递给addEventListener方法,该侦听器将注册为活动状态,并可以使用e.preventDefault()事件方法停止Chrome的默认行为。


Nie*_*jes -4

你在错误的层面上看待问题。OnBeforeUnload 根本不会被触发,因为从浏览器的角度来看没有卸载任何内容。因此,坦率地说,您实现了错误的版本控制机制 - 片段用于页面状态,而不是您现在使用的文档状态。

如果您坚持通过哈希片段维护状态,则需要使用另一种机制来防止页面状态更改。由于当前所有浏览器都支持 LocalStorage 我会使用它。好吧,同时,将所有文档状态数据放在那里,而不是放在 URL 中,因为 Google Docs 就是这样做的,这就是为什么他们没有这个问题。