KeyboardEvent в Chrome, код ключа 0 - PullRequest
26 голосов
/ 20 января 2012

Я пытаюсь установить keyCode для отправленного объекта события.

При нажатии кнопки в текстовом поле генерируется событие, имитирующее событие нажатия клавиши.Событие инициировано успешно, но keyCode равно 0. Мне нужно отправить объект события с правильным keyCode в текстовое поле.Я использовал код из здесь .

Как установить значение keyCode в отправленном событии?

<html>
    <head>      
    </head>
    <body>
        <input type="button" id="btn" value="Click"></input>
        <input type="text" id="txt"></input>
        <script>
            document.getElementById('btn').addEventListener("click", btnClick);
            document.getElementById('txt').addEventListener("keydown", txtKeydown);         

            function btnClick(e) {
                var txt = document.getElementById('txt');               

                var dispatchKeyboardEvent = function(target, initKeyboradEvent_args) {
                    var e = document.createEvent("KeyboardEvents");
                    e.initKeyboardEvent.apply(e, Array.prototype.slice.call(arguments, 1));
                    e.keyCode = 83;
                    e.charCode = 0;
                    target.dispatchEvent(e);
                };

                var canceled = !dispatchKeyboardEvent(txt,
                'keydown', true, true,  // type, bubbles, cancelable
                window,  // window
                's',  // key
                0, // location: 0=standard, 1=left, 2=right, 3=numpad, 4=mobile, 5=joystick
                false, false, false);  // Ctr, Alt, Shift
            }

            function txtKeydown(e) {
                console.dir(e);
                console.log(e.keyCode);
            }

        </script>
    </body>
</html>

Ответы [ 6 ]

36 голосов
/ 21 сентября 2012

Я поражен, что этот жук сидел там целую вечность. Кажется, есть обходной путь с использованием общих событий. Вот демоверсия: http://jsbin.com/awenaq/3

9 голосов
/ 23 марта 2012

Похоже, прошло немного времени с тех пор, как вы задали этот вопрос, поэтому, возможно, вы уже нашли ответ на свой вопрос.Однако, если вы этого не сделали, в Webkit есть ошибка , как было указано в этом SO вопросе , из-за которого keyCode всегда будет равен 0. Очевидно, что вы мало что можете сделатьпока они это не исправят.К сожалению, не похоже, что кто-то действительно работает над этим.Это не тот ответ, который вы хотите услышать, но это действительно единственный ответ, который кто-либо может дать вам прямо сейчас.

0 голосов
/ 10 января 2019

Это происходит потому, что (как уже говорили другие) объект KeyboardEvent (который использует charCode вместо keyCode) вызывается вместо объекта Event. Когда вы используете:

function txtKeydown(e) {
    console.dir(e);
    console.log(e.keyCode);
}

если вы печатаете 0 на консоли, попробуйте использовать e.charCode вместо e.keyCode

см. Веб-документы MDN для получения дополнительной информации о KeyboardEvent: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

0 голосов
/ 05 января 2017

Если у вас есть jQuery:

$.Event(event, { keyCode: 13 });

Это целевое использование.
Источник .

0 голосов
/ 21 марта 2015

Это не ошибка ... эта функция отсеивается, устарела, запрещена, какое имя будет завтра ... Вы не можете полагаться, что эта функция будет работать долго. ... и это широко открытая угроза безопасности ... найдите другой способ сделать то, что вы пытаетесь сделать. Проконсультируйтесь со спецификациями MOZILLA, и вы увидите БОЛЬШОЙ ПЛОХОЙ КРАСНЫЙ БАННЕР, который предупреждает, чтобы избежать этого, как чума. Они не исправят это, возвращая 0, они эффективно останавливают кровотечение без изменения кода, за исключением одного места, где он всегда сбрасывает keyCode до 0.

0 голосов
/ 03 марта 2015

Я столкнулся с той же проблемой с устройствами Android, такими как Sony Xperia и HTC Devices. Итак, я нашел альтернативное решение: пожалуйста, обратитесь к моему ответу на этот вопрос KeyCode возвращает 0 всегда

...