Проверьте клавиши Ctrl / Shift / Alt на событии " click



Как я мог определить , которыйCtrl/Shift/ Alt клавиши нажимаются в следующем коде ?



$("#my_id").click(function() {
if (<left control key is pressed>) { alert("Left Ctrl"); }
if (<right shift and left alt keys are pressed>) { alert("Right Shift + Left Alt"); }
});
445   9  

9 ответов:

Ну вы это не будет работать во всех браузерах просто IE 8. Microsoft реализовала возможность определять, какая (правая/левая) клавиша была нажата. Вот ссылка http://msdn.microsoft.com/en-us/library/ms534630 (VS. 85). aspx

Я также нашел эту удивительную статью о keypress, keyup, keydown событии в браузерах. http://unixpapa.com/js/key.html

$('#someelement').bind('click', function(event){ 

    if(event.ctrlKey) {
      if (event.ctrlLeft) {
        console.log('ctrl-left'); 
      }
      else {
        console.log('ctrl-right');
      }
    }
    if(event.altKey) {
      if (event.altLeft) {
        console.log('alt-left'); 
      }
      else {
        console.log('alt-right');
      }
    }
    if(event.shiftKey) {
      if (event.shiftLeft) {
        console.log('shift-left'); 
      }
      else
      {
        console.log('shift-right');
      }
    }
  }); 
$('#someelement').bind('click', function(event){
   if(event.ctrlKey)
      console.log('ctrl');
   if(event.altKey)
      console.log('alt');
   if(event.shiftKey)
      console.log('shift');

});

Я не знаю, можно ли проверить наличие левых/правых клавиш в событии click, но я не думаю, что это возможно.

e.originalEvent.location возвращает 1 для левой клавиши и 2 для правой клавиши. Поэтому вы можете обнаружить что modifier клавиша нажата следующим образом. Надеюсь, это поможет вам.

var msg = $('#msg');
$(document).keyup(function (e) {
      if (e.keyCode == 16) {
          if (e.originalEvent.location == 1)
              msg.html('Left SHIFT pressed.');
          else
              msg.html('Right SHIFT pressed.');
      } else if (e.keyCode == 17) {
          if (e.originalEvent.location == 1)
              msg.html('Left CTRL pressed.');
          else
              msg.html('Right CTRL pressed.');
      } else if (e.keyCode == 18) {
          if (e.originalEvent.location == 1)
              msg.html('Left ALT pressed.');
          else
              msg.html('Right ALT pressed.');
        
          e.preventDefault(); //because ALT focusout the element
      }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Press modifier key: </label>
<strong id="msg"></strong>

в большинстве случаев ALT,CTRLи SHIFT ключевые булевы будут работать, чтобы увидеть, если эти клавиши были нажаты. Например:

var altKeyPressed = instanceOfMouseEvent.altKey

при вызове он вернет true или false. Для получения дополнительной информации перейдите в https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey

для дальнейшего использования, есть также один называется metaKey (только для NS / firefox), который работает при нажатии клавиши meta.

использовать js-горячие клавиши. Это плагин jQuery.

Это тест, чтобы показать, что вы ищете. Он также показывает вам, как захватить влево, вправо, вверх, вниз стандартные клавиши и те из цифровой клавиатуры (тот, с номерами 2,4,6,8)! http://afro.systems.googlepages.com/test-static-08.html

после мой комментарий, это возможное решение.

чтобы проверить, какая конкретная клавиша модификатора нажата, вы можете использовать KeyboardEvent Location (посмотреть таблицу поддержки)

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

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

здесь я фиксирую событие, используя соответствующий метод прослушивателя javascript (jQuery не поддерживает захват фазы). Мы фиксируем событие для обработки случая, когда keydown/keyup распространение событий было бы остановлено по какой-то причине уже используемым кодом.

/* global variable used to check modifier keys held */
/* Note: if e.g control left key and control right key are held simultaneously */
/* only first pressed key is handled (default browser behaviour?)*/
window.modifierKeys = (function() {
  /* to handle modifier keys except AltGr which is key shortcut for controlRight + alt */
  var mKeys = {};
  /* to fire keydown event only once per key held*/
  var lastEvent, heldKeys = {};
  // capture event to avoid any event stopped propagation
  document.addEventListener('keydown', function(e) {
    if (lastEvent && lastEvent.which == e.which) {
      return;
    }
    lastEvent = e;
    heldKeys[e.which] = true;
    setModifierKey(e);
  }, true);
  // capture event to avoid any event stopped propagation
  document.addEventListener('keyup', function(e) {
    lastEvent = null;
    delete heldKeys[e.which];
    setModifierKey(e);
  }, true);

  function setModifierKey(e) {
    mKeys.alt = e.altKey;
    mKeys.ctrlLeft = e.ctrlKey && e.location === 1;
    mKeys.ctrlRight = e.ctrlKey && e.location === 2;
    mKeys.shiftLeft = e.shiftKey && e.location === 1;
    mKeys.shiftRight = e.shiftKey && e.location === 2;
  }
  return mKeys;
})();

/* on div click, check for global object */
$('.modifierKey').on('click', function() {
  console.log(modifierKeys);
  /* for demo purpose */
  $('.info').text(function() {
    var txt = [];
    for (var p in modifierKeys) {
      if (modifierKeys[p]) txt.push(p);
    }
    return txt.toString();
  });
})
/* for demo purpose */

.info:not(:empty) {
  border: 1px solid red;
  padding: .1em .5em;
  font-weight: bold;
}
.info:not(:empty):after {
  content: " held";
  font-weight: normal;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="modifierKey" tabindex="-1">
  DIV to catch modifier keys on click
</div>
<br>
<span class="info"></span>

на:

  • ALT GR клавиша-это клавиша быстрого доступа для CTRL-Right & ALT ключи
  • удерживая одновременно две клавиши indentical модификатора (например.г сдвиг влево & Shift-Rigth keys), приведет к тому, что будет обработан только первый (похоже, что поведение браузера по умолчанию, так или иначе, кажется правильным!)

проще всего: вы используете событие keydown, чтобы проверить, если это Ctrl (17) или Shift (16) можно использовать событие keyup, чтобы проверить, если это введите (13) и Ctrl или Shift перед нажмите (на клавишу) отменить Ctrl или Shift на любой ключ, но введите

работает как шарм! и на Chrome, Firefox, IE, и Edge тоже;)https://jsfiddle.net/55g5utsk/2/

var a=[];
function keyName(p){
    var cases = {16:'Shift',17:'CTRL',18:'Alt'};
    return cases[p] ? cases[p] : 'KeyCode: '+p;
}
function keyPosition(p){
    var cases = {1:'Left',2:'Right'};
    return cases[p] ? cases[p]+' ' : '';
}
$('input').on('keydown',function(e){
    a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode));
})
$('input').on('keyup',function(){
    var c='';
    var removeDuplicates = [];
    $.each(a, function(i, el){
        if ($.inArray(el, removeDuplicates) === -1) {
           removeDuplicates.push(el);
           c=c+(el)+' + ';
        }
    });
    a=[];
    alert(c.slice(0, -3))
});

следующая версия с событием click http://jsfiddle.net/2pL0tzx9/

var a=[];
function keyName(p){
    var cases = {16:'Shift',17:'CTRL',18:'Alt'};
    return cases[p] ? cases[p] : '';
}
function keyPosition(p){
    var cases = {1:'Left',2:'Right'};
    return cases[p] ? cases[p]+' ' : '';
}
$(document).on('keydown',function(e){
    a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode));
})
$('#my_id').on('click',function(){
    var c='';
    var removeDuplicates = [];
    a =a.filter(function(v){return v!==''});
    $.each(a, function(i, el){
      if ($.inArray(el, removeDuplicates) === -1){
          removeDuplicates.push(el);
          c=c+(el)+' + ';
      }
    });
    if (c) alert(c.slice(0, -3));
    a=[];   
});

есть несколько причин, что справа и слева CTRL, SHIFT & ALT ключи не различимы, потому что 1. коды такие же 2. Многие клавиатуры ноутбуков могут не иметь двух клавиш управления Взята ссылка : как я могу сказать, если событие происходит от правой клавиши Ctrl?

Comments

    Ничего не найдено.