JavaScript: показать пароль при удержании

#javascript #jquery #html #input

#javascript #jquery #HTML #ввод

Вопрос:

У меня есть 2 входа для паролей. В каждом поле ввода есть кнопка «показать», которая показывает пароль при удержании этой кнопки.

 <form name="resetting_form" method="post" action="">
    <div class="form-group has-feedback">
        <input type="password" id="password_first" required="required" placeholder="New Password" class="form-control">
        <span class="show">show</span>
    </div>
    <div class="form-group has-feedback">
        <input type="password" id="password_second" required="required" placeholder="Repeat Password" class="form-control">
        <span class="show">show</span>
    </div>  
    <input type="submit" class="btn btn-primary" value="Submit">
</form>
  

Вот что у меня есть

 $(".form-control").on("keyup",function(){
    if ($(this).val())
        $(".show").show();
    else
        $(".show").hide();
});

$(".show").mousedown(function(){
    $(".form-control").attr('type','text');
}).mouseup(function(){
    $(".form-control").attr('type','password');
}).mouseout(function(){
    $(".form-control").attr('type','password');
});
  

Проблема

Когда я нажимаю кнопку «показать», отображаются оба поля ввода. Как убедиться, что отображается только соответствующий пароль?

Комментарии:

1. Нижние решения выглядят хорошо, однако я бы не стал привязывать его к классу начальной загрузки. Вы рискуете пропустить много EventListeners. Возможной оптимизацией было бы привязать к родительской ссылке: $(‘.form-control’, ‘#some-parent-id’).//логика

Ответ №1:

При использовании $(".form-control") jquery выберите все .form-control элементы. Но вам нужно выбрать целевой элемент с помощью this переменной в функции события и использовать .prev() для выбора предыдущего элемента.

 $(".show").mousedown(function(){
    $(this).prev().attr('type','text');
}).mouseup(function(){
    $(this).prev().attr('type','password');
}).mouseout(function(){
    $(this).prev().attr('type','password');
});
  

Ответ №2:

Просто укажите предыдущий ввод вместо всех вводов с данным классом

  $(".form-control").on("keyup", function() {
   if ($(this).val())
     $(this).next(".show").show();
   else
     $(this).next(".show").hide();
 }).trigger('keyup');

 $(".show").mousedown(function() {
   $(this).prev(".form-control").prop('type', 'text');
 }).mouseup(function() {
   $(this).prev(".form-control").prop('type', 'password');
 }).mouseout(function() {
   $(this).prev(".form-control").prop('type', 'password');
 });  
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form name="resetting_form" method="post" action="">
  <div class="form-group has-feedback">
    <input type="password" id="password_first" required="required" placeholder="New Password" class="form-control">
    <span class="show">show</span>
  </div>
  <div class="form-group has-feedback">
    <input type="password" id="password_second" required="required" placeholder="Repeat Password" class="form-control">
    <span class="show">show</span>
  </div>

  <input type="submit" class="btn btn-primary" value="Submit">
</form>  

Ответ №3:

В react мы просто делаем с


Вероятно, нам нужно использовать события OnMouseDown и OnMouseUp, onMouseOut

 onMouseDown={handleShowPassword}
onMouseUp={handleShowPassword}
onMouseOut={handleShowPasswordHideOnMouseOut}
  

Комментарии:

1. Посмотрите на теги в вопросе (и код в нем). Они используют jQuery, а не React.

2. Вам также не удалось определить ни одну из функций, которые вы передаете реквизитам обработчика событий.