Запуск події onclick за допомогою середнього клацання


90

Я використовую onclickподію хешованого посилання, щоб відкрити a <div>як спливаюче вікно. Але середній клік не ініціює onclickподію, а лише приймає hrefзначення атрибута посилання та завантажує URL-адресу на нову сторінку. Як я можу за допомогою середнього клацання відкрити <div>спливаюче вікно?


15
Я все ще не розумію, як була вирішена проблема, коли середній клацання не викликає подію onclick.
Томаш Зато - відновити Моніку

3
Браузери @ TomášZato не запускають подію "клацання" за допомогою клацання середнім клацанням, але вони можуть запускати подію "клацання миші". Тоді фреймворк javascript може прив’язати це до дії „клацання”, щоб заплутати вас. Я рекомендую прочитати unixpapa.com/js/mouse.html
rds

Відповіді:


64

РЕДАГУВАТИ

Ця відповідь застаріла і не працює в Chrome. Ви, швидше за все, в кінцевому підсумку використаєте подію auxlink , але зверніться до інших відповідей нижче.

/ РЕДАКТУВАТИ


відповідь жебраків правильна, але схоже, ви хочете запобігти дії за замовчуванням середнього клацання. У такому випадку включіть наступне

$("#foo").on('click', function(e) {
   if (e.which == 2) {
      e.preventDefault();
      alert("middle button"); 
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a id="foo" href="http://example.com">middle click me</a>

prevenDefault () зупинить дію події за замовчуванням.


19
Майте на увазі, що його .liveбуло припинено та вилучено на користь.on
Нафталі, він же Ніл,

2
Для мене FF працює лише з подією Mousedown. Подія Click викликає цю річ scr.hu/1kig/su5c9
l00k

1
Чи існує якась константа між переглядачами для цього 2?
fracz

11
Це більше не працює в Chrome 55. Див. 1 , 2 та це питання
billc.cn

1
Як це рішення, коли проблема полягала в тому, що середній клацання не ініціює подію клацання для початку?
Дражен Бєловук

32

Для того, щоб виявити кнопку середнього клацання / коліщатка миші, потрібно використати подію auxclick. Наприклад:

<a href="https://example.com" onauxclick="func()" id="myLink"></a>

Потім у вашому файлі сценарію

function func(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
}

Якщо ви хочете зробити це з JavaScript (без використання атрибута HTML onauxclick), ви перейдете addEventListenerдо елемента:

let myLink = document.getElementById('myLink')
myLink.addEventListener('auxclick', function(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
})
<a id="myLink" href="http://example.com">middle click me</a>

Ознайомтесь з mdn-сторінкою про auxclickподію тут .


Примітка: onauxclick буде працювати, але посилання в новій вкладці не відкриється ...
Джонатан Лаліберте

2
Це єдина відповідь, яка насправді працює в Chrome. Якщо вам потрібна подія "клацання" для правої кнопки миші, ви можете використовувати "контекстне меню" (хоча воно запускається не лише правою кнопкою миші): developer.mozilla.org/en-US/docs/Web/API/Element/…
Humpparitari

1
поєднуючись із наведеною вище відповіддю, ви можете запобігти захопленню правою кнопкою миші за if(event.button==1)реченням, це єдина робоча відповідь.
Бадді

Зверніть увагу, що вам потрібно використовувати як auxclickподію, так і перевірити значення e.button == 1. Я відредагував відповідь.
Флімм

26

Можна використовувати

event.button

щоб визначити, на яку кнопку миші клацнули.

Повертає ціле значення, що вказує на кнопку, яка змінила стан.

  • 0 для стандартного "клацання", як правило, лівої кнопки
  • 1 для середньої кнопки, як правило, клацання коліщатком
  • 2 для правої кнопки, як правило, клацніть правою кнопкою миші

Зверніть увагу, що ця угода не дотримується в Internet Explorer: докладніше див. У розділі QuirksMode.

Порядок кнопок може бути різним, залежно від того, як було налаштовано вказівний пристрій.

Також читайте

На яку кнопку миші клацнули?

Існує дві властивості, щоб дізнатись, яку кнопку миші натиснуто: яку та кнопку. Зверніть увагу, що ці властивості не завжди працюють під час натискання. Щоб безпечно виявити кнопку миші, вам потрібно використовувати події миші або миші.

document.getElementById('foo').addEventListener('click', function(e) {
  console.log(e.button);
  e.preventDefault();
});
<a id="foo" href="http://example.com">middle click me</a>


4
Я б рекомендував використовувати, event.whichоскільки це було стандартизовано для браузерів у джерелі jQuery - рядок 2756 -if ( !event.which && event.button ) event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
Russ Cam

2
@RussCam Однак MouseEvent.whichне визначено в жодній специфікації, але MouseEvent.buttonвизначено у подіях DOM L2.
Oriol

@Oriol правильний, але реалізований по-різному у різних постачальників браузерів. Операційна програма позначила це питання jQuery, тому я запропонував використовувати, event.whichале мав би розробити MouseEvent.whichце, що не є частиною офіційної специфікації.
Russ Cam

@rahul, А як щодо ігрових мишей з більш ніж 7 кнопками? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier

Насправді, це не працює у таких браузерах, як Firefox чи Chrome, лише для основного клацання. Див. 1 , 2 і це питання .
Флімм

8

Я зазвичай ненавиджу, коли люди пропонують альтернативи замість рішень, але оскільки рішення вже були надані, я порушу своє власне правило.

Веб-сайти, на яких функція середнього клацання перевизначена, як правило, дуже, дуже наслідують мене. Зазвичай я натискаю середню клавішу, оскільки хочу відкрити новий вміст на новій вкладці, маючи безперешкодний перегляд поточного вмісту. Кожного разу, коли ви можете залишити функцію середнього клацання в спокої та зробити відповідний вміст доступним за допомогою атрибута HREF вашого натиснутого елемента, я впевнений, що саме це вам слід робити.


але що, якщо у вас є вкладки на вашій веб-сторінці і ви хочете мати таку ж поведінку, як у вашому браузері? Тоді Middleclick повинен закрити існуючу вкладку.
cmxl

6

jQuery надає .whichатрибут події, який надає ідентифікатор кнопки клацання зліва направо як 1, 2, 3. У цьому випадку ви хочете 2.

Використання:

$("#foo").live('click', function(e) { 
   if( e.which == 2 ) {
      alert("middle button"); 
   }
}); 

Відповідь Адамантія також спрацює, але вам потрібно стежити за IE, як він зазначає:

$("#foo").live('click', function(e) { 
   if((!$.browser.msie && e.button == 1) || ($.browser.msie && e.button == 2)) { 
     alert("middle button"); 
   } 
});

Також пам’ятайте, що .buttonатрибут - 0-індексований, а не 1-індексований, як .which.


чи можу я замінити функціональність браузера mozilla !! наприклад, за лівою клавішею миші відкриється спливаюче вікно .... але для середнього клацання це не відкриває спливаюче вікно, а відкривається нова вкладка, в якій спливаюче вікно не відкривається .. тому я хочу замінити функціональність середнього клацання mozilla ....
Садеш Кумар N

Mozilla має налаштування відкривати всі спливаючі вікна в новій вкладці, а не у новому вікні. Якщо у користувача ввімкнено цю опцію, я не думаю , що ви можете щось зробити. Якщо цього не відбувається, чи можете ви опублікувати код чи посилання на сторінку проблеми?
благає

Це не працює у таких браузерах, як Firefox та Chrome.
Флімм

6

Це питання трохи застаріле, але я знайшов рішення:

$(window).on('mousedown', function(e) {
   if( e.which == 2 ) {
      e.preventDefault();
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Chrome не запускає подію "клацання" для колеса миші

Робота в FF та Chrome


Я не хочу припускати ваш варіант використання, але я б поспорився, що натомість багатьом людям насправді потрібна подія 'mouseup'. Це працює і з середньою кнопкою миші.
Божидар Станчев

Коли я пробую це у Firefox та Chrome, це не заважає поведінці за замовчуванням відкривати посилання в новій вкладці, навіть якщо e.preventDefault()це викликано.
Флімм

5

Правильним методом є використання .on, .liveяке було припинено, а потім видалено з jQuery:

$("#foo").on('click', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

Або якщо ви хочете "жити", як відчуваєте, і #fooнемає на вашій сторінці при запуску документа:

$(document).on('click', '#foo', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

оригінальна відповідь


Подія clickне працює для середньої кнопки миші у таких браузерах, як Firefox та Chrome.
Флімм


Так. Переповнення стека не має хорошого рішення для застарілих відповідей. Боюсь, мені доведеться подати голос, бо "Ця відповідь не корисна" вже. Гірше те, що закріплена відповідь може мати сотні чи тисячі голосів проти, оскільки вона застаріла, і вона все одно залишатиметься назавжди, якщо ОП не відповідає.
Флімм

Задайте нове запитання :-) (посилайтеся на це, кажучи, що воно застаріло, і ви хочете відповісти 2020). Але також можете використовувати події mousedown / mouseup, можливо?
Нафталі, він же Ніл,

Навіть якщо я це зроблю, такі люди, як я, все одно зіткнуться з цією відповіддю, коли надходять із пошукових систем, і будуть заплутані закріпленою неправильною відповіддю.
Флімм

3

Я знаю, що запізнився на вечірку, але для тих, хто все ще має проблеми з обробкою середнього клацання, перевірте, чи делегуєте ви подію. У разі делегування clickподія не запускається. Порівняйте:

Це працює для середніх клацань:

$('a').on('click', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Це не працює для середніх клацань:

$('div').on('click', 'a', function(){
  alert('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click here</a>
</div>

Якщо вам все-таки потрібно відстежувати середній клік за допомогою делегування події , єдиним способом, як зазначено у відповідному квитку jQuery , є використання mousedownабоmouseup замість цього. Подобається так:

Це працює для делегованих середніх кліків:

$('div').on('mouseup', 'a', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click me</a>
</div>

Подивіться це в Інтернеті тут .


Насправді, clickце не працює для середніх клацань, як у вашому першому прикладі.
Флімм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.