Отключение прокрутки среднего клика с помощью javascript

Фон. Я создаю таблицу, напоминающую whenisgood.net, поскольку она имеет click-n -drag toggling для элементов таблицы. Я хочу называть разные типы переключаемых кодов, когда левая, средняя и правая кнопки мыши активируют событие mousedown.

Используя JQuery, я начинаю хорошо.

$(".togglable").bind("contextmenu", function() {return false;});
$(".togglable").bind("mousedown", function(e){
  e.preventDefault();
  toggle(this, e);
});

В функции toggle() я могу использовать e.which, чтобы определить, какая кнопка была нажата.

Punchline. Я использовал e.preventDefault(), надеясь, что это остановит поведение прокрутки среднего клика по умолчанию. Это не так. Что я могу сделать, чтобы остановить действие прокрутки?

См. также "Запуск события onclick с помощью среднего щелчка"

Ответ 1

В настоящее время мое решение таково: (больше jquery!)

$(".togglable").wrap(
  "<a href='javascript:void(0);'
  onclick='return false;'></a>"
);

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

Firefox откроет новую вкладку, когда вы посередине, но только если вы не перетащите. Opera откроет новую вкладку, когда вы кликнете по середине, перетащите или нет. Поэтому я использовал href='javascript:void(0);' вместо href='#', чтобы браузер клиента не загружал целую страницу, а просто пустую страницу со странным URL-адресом.

Но это решение работает как шарм на Chrome и Safari. Он отлично работает с IE8, за исключением того, что теперь, когда я левый-щелчок-n-перетаскивание, он меняет указатель на символ "не может сделать", поскольку он думает, что я хочу перетащить ссылку где-нибудь. Не проиндексирован в более старых версиях IE.

Ответ 3

Это старый вопрос... но если я правильно его понимаю, вы хотите отключить прокрутку с помощью средней кнопки мыши.

В настоящее время вы можете сделать это с помощью одной строки vanilla JS:

document.body.onmousedown = function(e) { if (e.button === 1) return false; }

Ответ 4

Это уже немного старая нить, но я очень старался обойти это в Firefox (я все еще использую 3.6), и я поделюсь своими выводами, может быть, кто-то найдет это полезным.

Убедитесь, что если вы создаете пустой HTML файл (или небольшой документ с несколькими параграфами) и загружаете его в Firefox, средняя полоса прокрутки не появляется. Это связано с тем, что ширина и высота <body> меньше размера окна. Если вы ставите много <br>, это не тот случай, и полоса прокрутки появляется средним нажатием.

Google удалось предотвратить появление скроллера среднего клика в Google Maps в Firefox, убедившись (через JS), что размер <body> всегда меньше размера окна, плюс дополнительно <body style="overflow:hidden;">.

Это вряд ли возможно в общем случае, но иногда может быть полезно.