Перевірте клавіші 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.