Как предотвратить переход браузера назад / вперед в истории при прокрутке по горизонтали?

Как отключить функциональность современных браузеров по умолчанию с помощью JQuery или Native JS для перехода назад или вперед при прокрутке по горизонтали?

это обычно происходит при использовании трекпада и при прокрутке до конца или начала прокручиваемого div.

4 ответов


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

демо:http://jsfiddle.net/DerekL/RgDBQ/show/

вы не сможете вернуться на предыдущую веб-страницу, если вы не спам кнопку Назад или удерживайте кнопку назад и выберите предыдущую запись.

Примечание: onpopstate (или событие onbeforeunload) не работает на iOS.


поэтому я решил, так как я создал веб-приложение, почему бы не запросить пользователя для любых несохраненных изменений, которые отложат пользователя от потери несохраненных изменений или в конечном итоге на предыдущей или следующей странице в истории браузера.

вот решение, если кто-то еще сталкивается с этой проблемой, как я сделал:

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

Если вы находитесь на mac, это вызвано жестами Track Pad.

System Preferences -> Trackpad -> More Gestures. 

Не решение JS, которое вы ищете, но если вы просто хотите предотвратить его для себя, вы можете отключить эту функцию.


работает в Chrome и Safari (i.e протестировано с 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);