Подтвердить что ты не робот

JQuery: обнаружение cmd + click/control + click

У меня есть варианты моего веб-приложения на вкладках.

<ul id="tabs">
    <li><a href="a.php">aaa</a></li>
    <li><a href="b.php">bbb</a></li>
    <li><a href="c.php">ccc</a></li>
    <li><a href="d.php">ddd</a></li>
    <li><a href="e.php">eee</a></li>
</ul>

Когда пользователь нажимает на любую вкладку (в том же окне), появляется эффект fadeout, который я получаю с этим кодом, а затем автоматическое перенаправление:

$('ul#tabs li a').click(function(e){
    if(e.which == 1) {
        var link = $(this).attr('href');
        $('#content').fadeOut('fast',function(){
            window.location = link;
        });
    }
});

Он отлично работает, потому что он игнорирует средний щелчок мыши (при открытии опции на новой вкладке эффект не должен запускаться). Проблема в том, что если я открываю вкладку с комбинацией клавиатуры + мышь, вместо открытия новой вкладки, она запускает весь код эффекта/перенаправления.

Итак, как я могу обнаружить это с помощью jQuery:

  • cmd + щелчок левой кнопкой мыши (mac)
  • управление + щелчок левой кнопкой мыши (windows/linux)
4b9b3361

Ответ 1

В вашей функции click, e.metaKey оценивает значение true? Если да, то вы здесь.

Ответ 2

К сожалению, event.metaKey не оценивает true в Windows, когда ключ Ctrl удерживается нажатой.

К счастью, event.ctrlKey действительно оценивает значение true в этих ситуациях. Кроме того, вы можете рассмотреть shift + клики в обработчике событий.

Таким образом, ваш javascript-код вашей кросс-платформенной jquery будет выглядеть примерно так:

$('ul#tabs li a').on('click', function(e) {
    var link = $(this).attr('href');

    // Check "open in new window/tab" key modifiers
    if (e.shiftKey || e.ctrlKey || e.metaKey) {
      window.open(link, '_blank');
    } else {
      $('#content').fadeOut('fast',function(){
        window.location = link;
      });
    }
  }
});

Ответ 3

Использование e.metaKey не работает одинаково в окнах, поэтому для обнаружения в Windows вы можете использовать объект навигатора и посмотреть, нажимает ли пользователь ключ ctrl (по умолчанию открывается новая вкладка).

$('ul#tabs li a').click(function(a){
  var href = $(this).attr('href');
  // check if user clicked with command key (for mac) or ctrl key (for windows)
  if(a.metaKey || (navigator.platform.toUpperCase().indexOf('WIN')!==-1 && a.ctrlKey)) {
    window.open(href,'_blank');
  } else {
    $('#content').fadeOut('fast', function(){
        window.location = href;
    });
  }
});

Ответ 4

Я знаю, что вы хотите использовать jQuery, но я бы попросил Keymaster:

https://github.com/madrobby/keymaster

Это действительно здорово, я использую его для проекта, над которым я работаю, и это здорово.