Есть ли способ определить, с какой стороны была нажата клавиша Alt (справа или слева)? - PullRequest
17 голосов
/ 19 декабря 2011

Есть ли способ, которым мы можем определить, на какой стороне была нажата клавиша Alt , то есть различать левую или правую Alt ?Я где-то видел, что это возможно с IE со свойствами altLeft и altRight объекта Event.Если это правильно, как мы можем обнаружить его в Firefox с помощью JavaScript?

Вот как это работает в IE для altLeft:

window.onload = function(){
  document.getElementById('id').onkeydown = function(){
    alert(window.event.altLeft);
  }
}

Ответы [ 3 ]

11 голосов
/ 19 декабря 2011

2015 answer

DOM3 добавил свойство location событий клавиатуры (см. Также MDN ) (в более ранних версиях вместо этого было свойство keyLocation), котороеделает то, что вы хотите, и реализовано в последних версиях всех основных браузеров.

Демо:

document.getElementById("ta").addEventListener("keydown", function(e) {
  var keyLocation = ["Standard", "Left", "Right", "Numpad", "Mobile", "Joystick"][e.location];
  var message = "Key '" + (e.key || e.keyIdentifier || e.keyCode) + "' is down. Location: " + keyLocation;
  this.value += "\n" + message;
  e.preventDefault();
}, false);
<textarea id="ta" rows="10" cols="50">Click on here and press some modifier keys such as Shift</textarea>

2011 ответ

Нет.В общем, невозможно различить левую и правую клавиши-модификаторы в кросс-браузерном режиме.Все свойства shiftLeft, shiftRight, ctrlLeft, ctrlRight, altLeft, altRight window.event относятся только к IE, и в других браузерах не существует эквивалента.

DOM3 добавилlocation свойство событий клавиатуры (более ранние версии имели свойство keyLocation вместо этого), но Firefox не реализует это.

3 голосов
/ 19 декабря 2011

Хороший вопрос.Объект события не содержит ничего о том, какой alt нажат, но вы можете попробовать что-то вроде этого:

var altLeft = false,
    altRight = false,
    time = null;

document.onkeydown = function (e) {
    e = e || window.event;
    //The time check is because firefox triggers alt Right + alt Left when you press alt Right so you must skip alt Left if it comes immediatelly after alt Right
    if (e.keyCode === 18 && (time === null || ((+new Date) - time) > 50)) {
        altLeft = true;
        time = null;
    } else if (e.keyCode === 17) {
        altRight = true;
        time = + new Date;
    }
}

document.onkeyup = function (e) {
    e = e || window.event;
    if (e.keyCode === 18) altLeft = false;
    else if (e.keyCode === 17) altRight = false;
}

document.onclick = function () {
    console.log("left", altLeft, "right", altRight);
}

Это работает для меня в Firefox, в любом случае 17 и 18 (которые являются кодами клавиш для alt Right иСлева) может меняться в разных браузерах или операционных системах, поэтому вы должны проверить их.

0 голосов
/ 26 января 2016
<html>
    <head>
        <title></title>
        <script type="text/javascript">
        flag = 0;
        text = ['else', 'Ctrl', 'AltGr', 'Alt'];

        function key_down(e) {
            var aa = e.keyCode;
            if (aa == 18) {
                event.keyCode = 0;
                event.returnValue = false;
            }
            this_key(aa);
        }

        function this_key(fn1) {
            if (fn1 == 17) {
                flag = 1;
                timer = setTimeout('this_key(1)', 10);
                return;
            }
            if (fn1 == 18 && flag == 1) {
                clearTimeout(timer);
            }

            var aa = 0;

            if (fn1 == 1) {
                aa = 1;
            }
            if (fn1 == 18) {
                if (flag == 1) {
                    aa = 2;
                } else {
                    aa = 3;
                }
            }

            document.getElementById('result').innerHTML = text[aa];
            flag = 0;
        }
        </script>
    </head>

    <body onkeydown="key_down(event);">
        <div id="result" style="font-size: 5em;"></div>
    </body>

</html>

Вот мое решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...