Проверьте клавиши 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"); }
});
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