LINUX.ORG.RU

JavaScript. onkeydown, oninput

 


0

2

Привет ЛОР.

var game = new Game();

var eventAllowed = true;

inputField.onkeydown = function (event) {
    if (event.keyCode === 8) { // 8 значит BackSpace, если кто не в курсе
        game.deleteChar(inputField.value.length - 1);

        eventAllowed = false;
    }
};

inputField.oninput = function () {
    eventAllowed && game.addChar(inputField.value.substr(-1));

    eventAllowed = true;
};

Суть моей проблемы в том, что при _удерживании_ BackSpace не генерируется событие oninput, а значит и eventAllowed некому поставить в положение true.

На данный момент есть костыль:

inputField.onkeyup = function () {
    eventAllowed = true;
};

Есть ли возможность из onkeydown вообще не ставить eventAllowed в false когда идет удерживание? Спасибо.

★★

Последнее исправление: Razip (всего исправлений: 1)

Есть ли возможность из onkeydown вообще не ставить eventAllowed в false когда идет удерживание? Спасибо.

так они работают независимо друг от друга, в чем проблема то?

javaQest
()
Ответ на: комментарий от Razip

да я не про то. Че ты вообще хочешь сделать? разрулить их по принципу либо то либо это? Тогда сделай проще, типа

<html>
<head>

</head>
<body>

<input id="i">
<div id="d"></div>


<script>



i.onkeydown=i.oninput=function(event){
  if(event.keyCode&&event.keyCode==8) return d.innerHTML+="foo"
  if(!event.keyCode) d.innerHTML+="bar"
}




</script>

</body>
</html>

javaQest
()
Ответ на: комментарий от javaQest

Пишу клавиатурный тренажер. Ввод символов обрабатываю с помощью oninput (потому что onkeypress и другие гадость). Если пользователь хочет удалить введенный символ или ошибочный, то он нажимает BackSpace и удаляет, но это за собой влечет изменение значения поля ввода, а значит и генерируется событие oninput, которое я и отменяю с помощью флага eventAllowed и обратно ставлю последнему значение true.

Суть моей проблемы в том, что при _удерживании_ BackSpace не генерируется событие oninput, а значит и eventAllowed некому поставить в положение true.

Иначе ввод в game.addChar() не будет пропускаться.

var game = new Game();

var eventAllowed = true;

inputField.onkeydown = function (event) {
    if (event.keyCode === 8) { // 8 значит BackSpace, если кто не в курсе
        game.deleteChar(inputField.value.length - 1);

        // Что-нибудь типа такого, чтобы при удержании
        // eventAllowed оставался в true
        if (some expression) {
            eventAllowed = false;
        }
    }
};

inputField.oninput = function () {
    eventAllowed && game.addChar(inputField.value.substr(-1));

    eventAllowed = true;
};

Надеюсь что теперь понятно.

Razip ★★
() автор топика
Последнее исправление: Razip (всего исправлений: 1)
Ответ на: комментарий от Razip

Надеюсь что теперь понятно.

Это ты, типа, умным прикинулся? Ты навешал кучу обработчиков, флагов и прочего говна, которое не нужно. Я тебе показал, как(приблизительно) твою проблему решить проще. Дело твое.

javaQest
()

Суть моей проблемы

Короче, не знаю че там за суть у тебя, но вот этот код работает как ожидается, все там генерируется.

<html>
<head>

</head>
<body>

<input id="i">
<div id="d"></div>


<script>



i.onkeydown=i.oninput=function(){
  var flag
  return function(event){
   if(event.keyCode&&event.keyCode===8) {flag=true; return d.innerHTML+="onkeydown backspace event<br>"}
   if(event.keyCode&&event.keyCode!==8) return
   if(!event.keyCode&&flag) return flag=false
   d.innerHTML+="oninput event<br>"
 }
}()




</script>

</body>
</html>

javaQest
()
Ответ на: комментарий от javaQest

Переписал код, взяв за основу твой пример.

var game = new Game();

inputField.onkeydown = inputField.oninput = function (event) {
    if (!event.keyCode) { // oninput
        game.addChar(inputField.value.substr(-1));
    } else { // onkeydown
        if (event.keyCode === 8) {
            game.deleteChar(inputField.value.length - 1);
        }
    }
};

Вводим один символ.. все вводится, ура! Удаляем введенный символ.. удаляется, но, подождите, генерируется событие oninput и срабатывает game.addChar() передавая пустую строку в game что вызывает ошибку.

флагов и прочего говна, которое не нужно

флагов

Мало того что твой код нерабочий, так еще и такой код кому-то кроме тебя было бы тяжелее поддерживать или вообще невозможно.

В общем, убейся об стену.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Ну То есть зачем делать посимвольный ввод, если в общем тебе нужно сравнить то, что в Инпуте с образцом.

zz ★★★★
()
Ответ на: комментарий от Razip

Вводим один символ.. все вводится, ура! Удаляем введенный символ.. удаляется, но, подождите, генерируется событие oninput и срабатывает game.addChar() передавая пустую строку в game что вызывает ошибку.

Так это уже твои проблемы, клоун, тебе показали, как разрулить события. Может за тебя все твое говно переписать?

javaQest
()
Ответ на: комментарий от Razip

твой код нерабочий

Мой код рабочий. Запусти его в браузере и убедись в этом. То что ты не осилил даже переписать его, никого не волнует.

javaQest
()
Ответ на: комментарий от zz

А у меня там много всяких динамических штук прикручено к этому, например: у меня выделяется текущее вводимое слово и видно, что осталось набрать, а что уже набрано. Также если пользователь вводить неверный символ, то сообщить ему о ошибке.

Razip ★★
() автор топика
Ответ на: комментарий от javaQest

Ты навешал кучу обработчиков, флагов и прочего говна, которое не нужно

флагов

var flag
  return function(event){
   if(event.keyCode&&event.keyCode===8) {flag=true; return d.innerHTML+="onkeydown backspace event<br>"}
   if(event.keyCode&&event.keyCode!==8) return
   if(!event.keyCode&&flag) return flag=false
   d.innerHTML+="oninput event<br>"
var flag

Ты лицимер.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

BackSpace не генерируется событие oninput, а значит и eventAllowed некому поставить в положение true.

Ты там чушь пишешь. Не может оно не генерироваться, оно не зависит от твоих каракулей. Ищи ошибку в логике.

javaQest
()
Ответ на: комментарий от Razip

Я тебе сразу написал

они работают независимо друг от друга

javaQest
()
Ответ на: комментарий от Razip

ну в этом смысле да, если не будет keyup, значит и и онинпут не будет. Но пока твой юзер жмет бекспейс, он ничего не вводит, так что я не вижу никакой проблемы в этом смысле.

javaQest
()
Ответ на: комментарий от javaQest

А я ведь с самого начала это говорил.

Но пока твой юзер жмет бекспейс, он ничего не вводит, так что я не вижу никакой проблемы в этом смысле.

В моем первом сообщении описана проблема.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

В моем первом сообщении описана проблема.

Какая нахрен проблема? юзер отпустил бекспейс, сработал онинпут, флаг установился в true. При следующем нажатии все должно работать как обычно. В чем проблема?

javaQest
()
Ответ на: комментарий от javaQest

Суть моей проблемы в том, что при _удерживании_ BackSpace не генерируется событие oninput, а значит и eventAllowed некому поставить в положение true.

при _удерживании_ BackSpace не генерируется событие oninput

Ты умеешь вообще читать? Потом ты сам сказал это когда я тебе скинул пример на JSFiddle:

ну в этом смысле да, если не будет keyup, значит и и онинпут не будет. Но пока твой юзер жмет бекспейс, он ничего не вводит, так что я не вижу никакой проблемы в этом смысле.

Что подтверждает мои слова, что oninput не генерируется когда зажат BackSpace.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

У тебя, кстати, и с кейапом то же самое будет, что и с онинпутом.

javaQest
()
Ответ на: комментарий от javaQest

keyup завершает серию keydown и ставит флаг в true и oninput с game.addChar успешно обрабатывается при вводе символа, я проверял.

Если бы была возможность знать что keydown повторяется и не ставить флаг в false, то и необходимости в keyup, который ставит флаг в true не было бы.

Razip ★★
() автор топика
Ответ на: комментарий от javaQest

if(event.keyCode&&event.keyCode===8)

if (event.keyCode === 8)

anonymous
()
var game = new Game();

var eventAllowed = true;

inputField.onkeydown = function (event) {
    if (event.keyCode === 8) {
        game.deleteChar(inputField.value.length - 1);

        eventAllowed = false;
    } else {
        eventAllowed = true;
    }
};

inputField.oninput = function (event) {
    eventAllowed && game.addChar(inputField.value.substr(-1));
};
Razip ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.