JQuery имитирует одно событие ввода для другого ввода

У меня есть два идентификатора ввода текста: input1 и input2. Я хотел бы имитировать нажатие клавиши на входе1 на вход2. Я не могу копировать значения onblur, потому что после симуляции я изменю значение input1. Не могли бы вы сообщить мне, как это сделать в jQuery 1.6 или Javascript? Я пробовал ниже, но это не работает и меняет значение, т.е. $('#'+origid).val() возвращает пустое значение.

$(".maskedinput").keyup(function (e) {
        var value = $.trim($(this).val());
        var origid = $(this).attr('origid');
        var originalelemevt = jQuery.Event( "keypress" );
        originalelemevt.which = e.which;
        originalelemevt.keycode = e.keycode;

        $('#'+origid).trigger( originalelemevt );
        var newval = '';
        if (value.length >=4){
            var orignal = value.substring(0,value.length-4);
            for(var i=0;i<orignal.length;i++)
                newval +='*';

            newval +=value.substring(orignal.length);
            $(this).val(newval);
        }

    });

$(document).ready(function() {
  $("#I1").keyup(function (e) {
        var value = $.trim($(this).val());
        var newval = '';
        
        if (value.length >=4){
            var orignal = value.substring(0,value.length-4);
            for(var i=0;i<orignal.length;i++)
                newval +='*';

            newval +=value.substring(orignal.length);
            $(this).val(newval);
        }

        $('#I2').val(e.target.value);

    });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>

<form id='F1'>
  <input id='I1'>
  <input id='I2'>
</form>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
365
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это то, что я искал, событие нажатия клавиши на id1.

$("#id1").keypress(function(e) {
  var inputkey = e.which || e.keyCode;
  var result = getInputSelection(document.getElementById("id1"));
  $("#id2").trigger("keypress")
    .val(function(i, val) {
      var key = e.which || e.keyCode;
      // return this.value + String.fromCharCode(key);

      return this.value.substr(0, result.start) + String.fromCharCode(key) + this.value.substr(result.end)
    });


});

$("#id1").keyup(function(e) {
  mask('id1');
});

$("#id1").keydown(function(e) {

  var inputkey = e.which || e.keyCode;
  //alert(inputkey);
  if (inputkey == 8) {
    e.preventDefault();
    var new_val = replaceValue(inputkey);
    //alert(new_val);
    $("#id1").val(new_val);
    $("#id2").val(new_val);
    // mask('id1');
  } else if (inputkey == 46) {
    e.preventDefault();
    var new_val = replaceValue(inputkey);
    //alert(new_val);
    $("#id1").val(new_val);
    $("#id2").val(new_val);
    // mask('id1');
  }
});

function mask(elid) {
  var $this = $('#' + elid);
  $this.val($this.val().replace(/.(?=.{4})/g, '*'));


}

function replaceValue(inputkey) {
  var result = getInputSelection(document.getElementById("id1"));
  // alert("Backspace "+result.start +","+result.end);
  var new_val = $("#id1").val();
  if (result.start == result.end) {
    if (inputkey == 8) {
      new_val = $("#id2").val().substr(0, result.start - 1) + $("#id2").val().substr(result.end);
    } else if (inputkey == 46) {
      new_val = $("#id2").val().substr(0, result.start) + $("#id2").val().substr(result.end + 1);
    }
  } else {

    new_val = $("#id2").val().substr(0, result.start) + $("#id2").val().substr(result.end);
  }
  return new_val;
}

function getInputSelection(el) {
  var start = 0,
    end = 0,
    normalizedValue, range,
    textInputRange, len, endRange;

  if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
    start = el.selectionStart;
    end = el.selectionEnd;
  } else {
    range = document.selection.createRange();

    if (range && range.parentElement() == el) {
      len = el.value.length;
      normalizedValue = el.value.replace(/\r\n/g, "\n");

      // Create a working TextRange that lives only in the input
      textInputRange = el.createTextRange();
      textInputRange.moveToBookmark(range.getBookmark());

      // Check if the start and end of the selection are at the very end
      // of the input, since moveStart/moveEnd doesn't return what we want
      // in those cases
      endRange = el.createTextRange();
      endRange.collapse(false);

      if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
        start = end = len;
      } else {
        start = -textInputRange.moveStart("character", -len);
        start += normalizedValue.slice(0, start).split("\n").length - 1;

        if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
          end = len;
        } else {
          end = -textInputRange.moveEnd("character", -len);
          end += normalizedValue.slice(0, end).split("\n").length - 1;
        }
      }
    }
  }

  return {
    start: start,
    end: end
  };
}
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#banner-message {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  font-size: 25px;
  text-align: center;
  transition: all 0.2s;
  margin: 0 auto;
  width: 300px;
}

button {
  background: #0084ff;
  border: none;
  border-radius: 5px;
  padding: 8px 14px;
  font-size: 15px;
  color: #fff;
}

#banner-message.alt {
  background: #0084ff;
  color: #fff;
  margin-top: 40px;
  width: 200px;
}

#banner-message.alt button {
  background: #fff;
  color: #000;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id = "banner-message">
  SSN:
  <input type = "text" id = "id1" />
  <input type = "text" id = "id2" style = "display:none" />
</div>

Чем полезно такое поведение? Относительно UX. Если бы я был пользователем и начал вводить какую-либо конфиденциальную информацию, я бы остановил и закрыл браузер, а затем выполнил бы проверку на наличие вирусов вручную. Такое поведение с точки зрения пользователя ошибочно, потому что оно на мгновение раскрывает конфиденциальную информацию, а затем возвращается к частичной маске — шаблон, который, вероятно, не знаком большинству пользователей (включая меня). Разрешить пользователю решать, как будет отображаться ввод — с маской или без нее — путем предоставления переключателя с помощью флажка (общая реализация), кнопки или аналогичного элемента управления формы или интерактивного тега.

zer00ne 27.07.2019 20:12

Проверьте URL-адрес jsfiddle.net/debopamppoddar/7ph2zfxu/96. У этого есть 3 разных варианта решения одной и той же проблемы.

Debopam 29.07.2019 08:19

Вариант 2 бесполезен, какая польза от частичной визуальной подсказки, если ввод должен быть точным? бывший. пароль = 12hhg9I и ввод показывает: ****g91. Пользователь может просто предположить, что это 12hh, но на самом деле это неправильно, потому что это 11hh — значит, в этот момент вы считаете, что маскирование частично помогает пользователю поймать ошибку или отвлечь его? Пользователь нажимает клавишу и удерживает ее, чтобы весь ввод был виден... попробуйте объяснить это пользователю. Пользователи AFAIK не держат пальцы на клавишах, если только они не используют комбинацию со сдвигом, контролем, альтернативой и т. д.

zer00ne 29.07.2019 12:19

Другие вопросы по теме