Можно ли заблокировать определенные клавиши на клавиатуре во время ввода в поле «edittext» - скрипт Photoshop CS6? - PullRequest
1 голос
/ 11 января 2020

Я хочу включить только ввод с клавиатуры клавиш: + - [0-9] , и отключить ввод остальных клавиш в поле edittext. Также, если edittext уже имеет какой-либо символ ,, я хочу заблокировать любую дальнейшую клавишу ,.

var mainWindow = new Window("dialog");
var edittext = mainWindow.add("edittext", undefined, 0);
edittext.characters = 40;

edittext.onChanging = function() {
    //enabling only input keys [0-9,-+] from keyboard
}

mainWindow.show();

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Попробуйте использовать следующий пользовательский пример ScriptUI .

Создает простое dialog окно , которое содержит два edittext элемента ,

  1. Первый элемент edittext имеет ограниченный ввод. Он позволяет вводить одну запятую , символ / клавишу и только одну или несколько следующих клавиш:

    0 1 2 3 4 5 6 7 8 9 + -

  2. Второй элемент edittext имеет неограниченный ввод. Он позволяет вводить любой символ / клавишу, т. Е. По умолчанию.


example.jsx

#target photoshop;

/**
 * @fileoverview Shows how to create a key restricted custom 'edittext' with
 * ScriptUI. This example permits only one comma `,` to be input and one or
 * more of following characters: `[0-9]` `+` `-`
 */

$.level=0;

//------------------------------------------------------------------------------
// Usage
//------------------------------------------------------------------------------

var mainWindow = new Window("dialog");


// 1. Example `edittext` element with restricted key input.
var label = mainWindow.add('statictext', undefined, 'Restricted input:');
label.alignment = 'left';

var edittext = mainWindow.add('edittext', undefined, 0);
edittext.characters = 40;
restrictInputKeys(edittext); //<-- Enable restricted input.


// 2. Example `edittext` element with unrestricted key input.
var label2 = mainWindow.add('statictext', undefined, 'Unrestricted input:')
label2.alignment = 'left';

var edittext2 = mainWindow.add('edittext', undefined, 0);
edittext2.characters = 40;


mainWindow.show();

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------

/**
 * Determines whether an array includes a certain value among its elements.
 * @param {String} valueToFind - The value to search for.
 * @param {Array} arrayToSearch - The array to search in.
 * @returns {Boolean} true if the value valueToFind is found within the array
 */
function inArray(valueToFind, arrayToSearch) {
  for (var i = 0, max = arrayToSearch.length; i < max; i++) {
    if (arrayToSearch[i] === valueToFind) {
      return true;
    }
  }
  return false;
}

/**
 * Restricts the character keys permitted in a `edittext` element.
 * @param {Object} editTextInstance - Reference to `edittext` ScriptUI element.
 */
function restrictInputKeys(editTextInstance) {

  if (editTextInstance.constructor.name !== 'EditText') {
    throw new Error ('Invalid class. Expected `EditText` class.')
  }

  var hasComma = false;

  var permissibleKeys = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
      'Minus', 'Comma', 'Escape', 'Backspace'];
  /*
   * Add a listener to the given `edittext` element to detect `keydown` events.
   * In the bddy of its handler function we detect each key pressed to determine
   * whether the key is permissible or impermissible.
   */
  editTextInstance.addEventListener('keydown', function (key) {
    var keyName = key.keyName;
    var shiftKeyIsDown = key.shiftKey;
    var altKeyIsDown = key.altKey;

    if (shiftKeyIsDown && keyName === 'Equal') {
      return;
    }

    if ((shiftKeyIsDown || altKeyIsDown) && inArray(keyName, permissibleKeys)) {
      key.preventDefault();
      return;
    }

    if (! hasComma && keyName === 'Comma')  {
      hasComma = true;
      return;
    }

    if (hasComma && keyName === 'Comma') {
      key.preventDefault();
      return;
    }

    if (! inArray(keyName, permissibleKeys)) {
      key.preventDefault();
    }
  });

  /*
   * The `onChanging` event is utilized to detect whether a comma already exists.
   * If a comma DOES NOT exist set the `hasComma` variable to `false`.
   */
  editTextInstance.onChanging = function() {
    if (this.text.indexOf(',') === -1) {
      hasComma = false;
    }
  }
}

Объяснение:

  • Это существенно добавляет прослушиватель событий к данному элементу edittext для обнаружения keydown событий.
  • В теле функции обработчика прослушивателей событий мы обнаруживаем каждую нажатую клавишу и определяем, является ли клавиша допустимой или недопустимой.
  • Событие onChanging используется, чтобы по существу определить, является ли запятая (,) уже была введена или нет. Если запятая не существует, когда происходит каждое событие onChanging, мы устанавливаем переменную hasComma в false. Используя событие onChanging и переменную hasComma, он предоставляет нам механизм для ограничения ввода только одной запятой (,).

Использование:

  • Обратите внимание, что в разделе "Использование" файла example.jsx мы разрешаем ввод данных с помощью ключа / символа с ограничениями, вызывая пользовательскую функцию restrictInputKeys и передавая ссылка на экземпляр элемента edittext, который мы хотим ограничить. т.е.

    restrictInputKeys(edittext); //<-- Enable restricted input.
    

    Если вы хотите включить ограниченный ввод с клавиатуры во втором экземпляре edittext, вам просто нужно снова вызвать функцию restrictInputKeys и передать ссылку на второй экземпляр edittext. Например:

    restrictInputKeys(edittext2); //<-- Enable restricted input for the second instance.
    

Примечание Я протестировал пример, представленный в PhotoShop CS5, и он успешно работал. Он не был протестирован в PhotoShop CS6 - могут потребоваться некоторые изменения.


0 голосов
/ 12 января 2020

Я не слишком уверен в остальном, но чтобы сделать так, чтобы можно было нажимать только цифры, вы можете изменить свой код на что-то вроде этого:

    edittext.keypress = function(e){
       if(e.keyCode < 48 || e.keyCode > 57){
         e.preventDefault();
       }
    }

После этого это будет вопрос простого нахождения правильной комбинации операторов if для остальных ключей, которые я бы предположил. Вы можете найти список кодов клавиш и соответствующих им ключей, выполнив поиск по «JavaScript кодам клавиш» в Google.

Надеюсь, это поможет!

...