2013-04-24 10 views
11

JQueryまたはNative JSを使用して、水平方向にスクロールするときに前後に移動するための最新のブラウザのデフォルト機能を無効にするにはどうすればよいですか?水平スクロール時にブラウザが履歴の前後に移動しないようにするにはどうすればよいですか?

これは、通常、トラックパッドを使用しているとき、およびスクロール可能なdivの最後またはスクロールまでスクロールしたときに発生します。

+2

ドライバおよびいずれかが他の私がやったように、この問題に遭遇場合はここで

は溶液でトラックパッドのソフトウェアはあなたの大将です。この[質問の回答](http://stackoverflow.com/questions/14086337/is-it-possible-to-have-gestures-with-trackpads)を参照してください。 – SimonDever

答えて

6

私はWebアプリケーションを作成したので、保存されていない変更が失われたり、ブラウザ履歴の前または次のページに終わることをユーザーに延期する保存されていない変更をユーザーに求めないようにしてください。

window.onbeforeunload = function(e) { 
    return 'Ask user a page leaving question here'; 
}; 
+0

Firefox 37で動作しません。 – RezaRahmati

+0

'e.preventDefault(); return false; – Jacksonkr

18
history.pushState(null, null, location.href); 
window.onpopstate = function(event) { 
    history.go(1); 
}; 

デモ:http://jsfiddle.net/DerekL/RgDBQ/show/

あなたは戻るボタンをスパムしない限り、以前のWebページに戻るか、戻るボタンを押したまま、前のエントリを選択することはできません。

注:onpopstate(またはイベントonbeforeunload)はiOSでは動作しません。

+2

そのようなブラウザの履歴を操作することは犯罪ではありませんが、ユーザーエクスペリエンスの観点からは非常に厄介です。それは非常に混乱し、迷惑です。あなたはどうしているのかを見ることができます –

+4

[戻る]ボタンを押し続けると、戻ってきます。 – 10basetom

+1

@steve確かに何の理由もなければ、それは厄介です。しかし、少なくとも一時的に、それを操作する正当なケースがあります...これを適用したいケースは、css [:target](https://developer.mozilla)の使用から不要な履歴トレイルをスキップする場合です.org/ja-ja/docs/Web/CSS /:target)の疑似クラスです。あるいは、履歴を無効にし、代わりにカスタムの '戻るボタン 'を提供するかもしれません。 – hexalys

3

あなたがマックにいる場合、これはトラックパッドジェスチャーによって発生します。

System Preferences -> Trackpad -> More Gestures. 

ないあなたが探しているJSのソリューションが、あなたが自分だけのためにそれを阻止したい場合は、機能をオフにすることができます。

+0

あなたはまさに正しいです、なぜ彼らはブラウザで前後にジャンプするそのような迷惑な方法を実装するのだろうか?私は、これは水平スクロールペインで何かを探すときに、どんなユーザにとっても迷惑であると思います。 –

2

ChromeとSafariでの動作(つまり、ChromeとSafariのでテスト):

// el === element on which horizontal scrolling is done 
// (can be container of scrolled element or body or any other ancestor) 
var preventHistoryBack = function (e) { 
    var delta = e.deltaX || e.wheelDeltaX; 

    if (! delta) { 
    return; 
    } 

    window.WebKitMediaKeyError /*detect safari*/ && (delta *= -1); 

    if (((el.scrollLeft + el.offsetWidth) === el.scrollWidth && delta > 0) || (el.scrollLeft === 0 && delta < 0)) { 
    e.preventDefault(); 
    } 
}; 
el.addEventListener('mousewheel', preventHistoryBack); 
+1

「wheel」と「mouseweel」は少し違って動作することに注意してください。https://stackoverflow.com/questions/25204282/mousewheel-wheel-and-dommousescroll-in-javascript – Jacksonkr

+0

これは動作しますが、Chrome 51以降'[違反]がコンソールにスクロールブロック'ホイール 'イベント'メッセージに非パッシブイベントリスナーを追加しました。しかし、私たちは 'preventDefault'と呼んでいるので非パッシブイベントが必要です。そのメッセージをどのように抑制するかは不明です – Klimashkin

関連する問題