Есть ли способ проверить, включает ли входное значение определенные ключевые коды? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть массив ключевых кодов, и мне нужно проверить, не включен ли какой-либо символ текстовой области в этот массив.Хотя было бы довольно легко проверить, находится ли нажатая клавиша в массиве, к сожалению, это не сработает, если, скажем, текст будет вставлен в текстовое поле.

Это значит, что мое ограничение на количество символов в текстовой области изменяется, если в текстовой области, которой нет в массиве, есть символ с ключевым кодом.Например, если keyCode для š (83) отсутствует в массиве, и он изменит ограничение на количество символов в зависимости от этого.

 dec_codes=[10, 12, 13, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,...]

Я не знаю, какой другой код предоставить.

И да, я знаю, что было бы намного лучше проверить, был ли массив символами, а не keyCodes, но массив был предоставлен мне, и мне просто интересно, смогу ли я достичь того, что мне нужно, без необходимости конвертироватьмассив.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Вам необходимо использовать комбинацию вставки и события нажатия клавиши.Вставить для обработки ctrl + v (вставка) содержимого.

Для проверки типа * или copy-paste ***** или copy-pate *h*e*l*l*o* **wo**rl**d**, где * имеет keyCode 42 и (пробел) имеет ключевой код 32.

const ta = document.getElementById("ta");
const dec_codes = [10, 12, 13, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42]

ta.addEventListener("keypress", function(e) {
  e.preventDefault();
  this.value += filterInput(e.key);
});

ta.addEventListener("paste", function(e) {
  e.preventDefault();
  this.value += filterInput(e.clipboardData.getData('text/plain'))
});

const filterInput = data => {
  return data.split("").filter(char => {
    return dec_codes.findIndex(code=> char.charCodeAt() === code) === -1
  }).join("");
}
<textarea id="ta"></textarea>
0 голосов
/ 28 декабря 2018

Привет, вы можете прослушать любой ввод в textarea и сравнить разделенную версию его текста с вашими кодами charCodeAt, и некоторые методы очень полезны, например,

function checker(charCodes, text) {
    return text.split().some(char => charCodes.indexOf(char.charCodeAt(0)) > -1);
}


textareaNode.addEventListener('input', event => {
    if(checker([101,105], event.target.value)){
        // char code exists
    } 
})
0 голосов
/ 28 декабря 2018

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

const charCodes = [10, 12, 13, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42].reduce((acc, x) => Object.assign({}, acc, {[String.fromCharCode(x)]: true}), {});

const hasChars = (source, charCodes) => {
  let len = source.length;
  
  while (len--) {
    if (source.charAt(len) in charCodes) {
      return true;
    }
  }
    
  return false;
}

console.log(hasChars("hello", charCodes))
console.log(hasChars("\nhello", charCodes))
console.log(hasChars("hel)o", charCodes))
...