Перевірте клавіші Ctrl / Shift / Alt під час натискання


79

Як я можу визначити, які 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"); }
});

@JeremyBanks Ви шукаєте KeyboardEvent Location ( див. Підтримку таблиці ) . У jQuery, використовуючи обгортку подій jq, вам потрібно використовувати event.originalEvent.location. Тоді логіка для реалізації при натисканні не така вже й складна, я здогадуюсь, просто встановіть якийсь прапор / об’єкт для подій клавіатури / клавіатури та перевірте це за кліком. Проблема може полягати в обробці altGrключа, який може дати несумісний результат. Якщо у мене буде час, я дам відповідь пізніше ...
А. Вольф

Відповіді:


77

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

Я також знайшов цю дивовижну статтю про натискання клавіш, клавіатуру, подію клавіатури у браузерах. 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');
      }
    }
  }); 

Вибачте, я не згадав, що мене цікавить Firefox 3.6.3. Відповідно оновив питання.
Міша Морошко

Міша Морошко. Вибачте, але поки це просто неможливо зробити у Firefox. Можливо, він буде реалізовувати "keyLocation", "keyIdentifier" або "shiftLeft" у майбутньому .... У мене є дика пропозиція, але я не впевнений, що це спрацює. Я знаю, що аплети JAVA здатні розпізнавати натискання правої та лівої клавіш. якщо ви зможете зафіксувати натискання клавіші в аплеті, а потім передати праву / ліву інформацію назад на веб-сайт. Я навіть не можу почати розповідати вам, як це зробити. але це ідея. Флеш може бути альтернативою аплету JAVA
Джон Хартсок

Так, я вважав, що ти не хочеш. Але зараз просто неможливо зробити uisng JQuery / HTML DOM та Firefox 3.6.3
Джон Хартсок

Так само ви могли б це зробити і з деяким Flash Actioncript3 , але я думаю, ви теж не хочете туди йти.
mVChr

Посилання на дивовижний режим в одному з інших коментарів свідчить про те, що це IE6 +, а не просто IE8 ...
Стобор,

40
$('#someelement').bind('click', function(event){
   if(event.ctrlKey)
      console.log('ctrl');
   if(event.altKey)
      console.log('alt');
   if(event.shiftKey)
      console.log('shift');

});

Я не знаю, чи можливо перевірити наявність лівої / правої клавіші в межах події клацання, але я не думаю, що це можливо.


1
Shift ліворуч і праворуч обидва мають код клавіші 16. Те саме, що і Ctrl (17) та alt (18)

9
Я думаю, вам доведеться почекати, поки підтримка DOM3 зможе розказати ліворуч праворуч. DOM 3 представляє event.keyLocation ( w3.org/TR/DOM-Level-3-Events/… ).
DaveS

Чи можливо, що Firefox 3.6.3 має певну реалізацію цього?
Міша Морошко

2
Здається, ці ліві / праві функції ще не реалізовані у Firefox. Для зсуву є запит на функцію, який ви можете позначити зірочкою: bugzilla.mozilla.org/show_bug.cgi?id=458433 ctrlLeft навіть не має запиту про помилку / функцію. Сторінка Quirksmode (хоча бракує інформації про будь-які останні браузери): quirksmode.org/dom/w3c_events.html#keyprops
Саймон Б.

7

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>


Я швидко переглянув Chrome і отримав такий самий результат, як і ви. Використовуйте event.locationабо, event.keyLocationможливо, запасний event.ctrlLeftваріант синтаксису для IE OLDTIMER.
Токімон

Використання event.location - це єдине, що мені вдалося в Chrome, щоб відрізнити ліві клавіші від правих.
Mac

e.originalEvent.locationпрацює у мене в Chrome, а також у Firefox. @Mac
Ібрагім Хан

Здається дивним у використанні keyup... Якщо ви хочете знати, чи Ctrlнатискали (утримували) під час a click, ви хотіли б використати keydownта встановити прапор, який потім можна перевірити в засобі прослуховування кліків. Скиньте прапор у keyup.
Stijn de Witt

7

У більшості випадків ALT, CTRLі SHIFTключової булеві буде працювати , щоб побачити , якщо були натиснуті ці клавіші. Наприклад:

var altKeyPressed = instanceOfMouseEvent.altKey

Коли його покличуть, він поверне істину чи помилку. Для отримання додаткової інформації перейдіть за посиланням https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey

Для подальшого довідкового запиту є також один із них metaKey(лише NS / firefox), який працює при натисканні мета-клавіші.


Це, мабуть, найкраща відповідь тут. Цікаво, що він не має позитивних голосів.
MarkSkayff

Варто зазначити, що це просте рішення може не вдатися, якщо користувач використовує Linux Mint 18 із налаштуваннями за замовчуванням. Якщо для налаштування ОС, знайденого у Налаштуваннях: Windows: Поведінка: Спеціальний ключ для переміщення та зміни розміру вікон встановлено значення Alt (як це за замовчуванням), утримання Alt призведе до того, що clickподія не буде запущена, а отже, функція, що посилається на altKeyвластивість ніколи не буде страчено.
Патрік Дарк

2

Слідом за моїм коментарем це можливе рішення.

Щоб перевірити, яку конкретну клавішу модифікатора натиснуто, ви можете використовувати 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 GRkey - це ярлик для CTRL-Right&ALT клавіш
  • утримання одночасно двох невід'ємних клавіш-модифікаторів (наприклад, клавіш Shift-Left та Shift-Rigth), призведе до того, що буде оброблено лише першу (здається поведінкою браузера за замовчуванням, тому в будь-якому випадку, здається правильно!)

2

Просто подумав, що додам відповідь, відповідну до 2020 року.


Тепер ви також можете використовувати MouseEvent.getModifierState()це - це підтримується більшістю браузерів на момент написання.

document.addEventListener("click", (evn) => {
  const shift = evn.getModifierState("Shift");
  const ctrl = evn.getModifierState("Control");
  const alt = evn.getModifierState("Alt");

  console.log("Mouse pressed! Modifiers:");
  console.table({shift, ctrl, alt});
});

Приклад

Застереження:

  • Примітно, що цей API не відрізняє лівий та правий модифікатори. Якщо ви піклуєтесь про це, вам якось не пощастило. Але, я думаю, це має значення лише для невеликої кількості випадків використання.
  • Одним з основних переваг цього API є те , що він підтримує інші , ніж модифікатори shift, ctrlі alt. Однак специфічна поведінка є дещо хибною в різних ОС через вроджені відмінності в платформі. Перевірте тут, перш ніж використовувати їх.

Дуже дякую. Це набагато чистіше!
Остін Берк,

1

Використовуйте js-гарячі клавіші . Це плагін jQuery.

Це тест, щоб показати, що ви шукаєте. Він також показує, як знімати стандартну та ліву, праву, вгору, вниз клавіші та клавіші з цифрової клавіатури (тієї, що має цифри 2,4,6,8)! http://afro.systems.googlepages.com/test-static-08.html


0

Простіше за все: ви використовуєте подію клавіатури, щоб перевірити, чи це Ctrl(17) або Shift(16), а потім використовуєте подію клавіатури, щоб перевірити, чи це Enter(13), Ctrlабо Shiftнатискаєте до (при натисканні клавіші) скасування Ctrlабо Shiftна будь-якій клавіатурі, алеEnter


0

Працює як оберіг! і на 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))
});

Далі версія з подією кліку 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=[];   
});

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