Проблемы с вводом в javascript

У меня проблема, когда я создаю входы с помощью кнопки: https://jsfiddle.net/bg0cv2az/

let liberatePasswordButtonClickHandler = e => {
    e.preventDefault()
    let idButtonPassword = $(e.currentTarget).closest('#password-changer')
    if (idButtonPassword = '#password-changer') {
        $(e.currentTarget).html(`<div class = "left-column">
                   <div class = "imput-wrapper top">
                     <div class = "imput-title">
                       <span><strong>New passoword</strong></span>
                     </div>
                     <input type = "password" placeholder = "New passoword here"/>
                   </div>
                   <div class = "imput-wrapper">
                     <div class = "imput-title">
                       <span><strong>Re-enter new password</strong></span>
                     </div>
                     <input type = "password" placeholder = "Re-enter new password here"/>
                   </div>
                 </div>`)
    }

}
$(document).on('click', '#password-changer', liberatePasswordButtonClickHandler)

Входы не работают, кто знает почему?

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

Deckerz 10.06.2019 15:18

Этот тест утверждения if неверен (= вместо ==), поэтому он всегда завершается успешно. Если бы эта опечатка была исправлена, ничего бы не получилось, потому что idButtonPassword будет объектом jQuery.

Pointy 10.06.2019 15:23
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это не работает, так как вы устанавливаете весь контент в теге <button>.

Вы действительно можете проверить это, нажмите и нажмите ввод. Когда вы нажимаете, вы можете вводить текст в элемент ввода. Но когда вы отпускаете, все очищается. Вы не можете получить кнопку редактирования, так как кнопка onClickListener активна на переднем плане.

Простое решение — очистить весь контент, а затем добавить html в <div>.

...
if (idButtonPassword = '#password-changer') {
                $(e.currentTarget).parent().empty() // <- modified line
               .html(`<div class = "left-column">
                   <div class = "imput-wrapper top">
                     <div class = "imput-title">
...

Вы можете проверить JSFiddleDemo здесь

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

Поэтому, если вы нажмете на что-нибудь внутри #password-changer (div), сигнал будет распространяться, и вы замените все внутренности div новым вводом.

Если я правильно понимаю проблему, это решение:

let liberatePasswordButtonClickHandler = e => {
    e.preventDefault()
    $('#password-changer').html(`
        <div class = "left-column">
        <div class = "imput-wrapper top">
            <div class = "imput-title">
                <span><strong>New passoword</strong></span>
            </div>
            <input type = "password" placeholder = "New passoword here"/>
        </div>
        <div class = "imput-wrapper">
            <div class = "imput-title">
                <span><strong>Re-enter new password</strong></span>
            </div>
            <input type = "password" placeholder = "Re-enter new password here"/>
        </div>
      </div>`);
};
$(document).on('click', '#password-changer .button-edit', liberatePasswordButtonClickHandler)

Объяснение:

  • $(document).on('click', '#password-changer .button-edit', liberatePasswordButtonClickHandler) применяет функцию liberatePasswordButtonClickHandler каждый раз, когда щелкают класс button-edit внутри контейнера с идентификатором password-changer
  • $('#password-changer').html(...) просто заменяет внутренности родительского div (это просто, потому что у него есть идентификатор)

Если вы хотите сделать это более общим, вы можете:

  • измените #password-changer на .password-changer, чтобы ссылаться на класс вместо идентификатора
  • Затем внутри при замене вашего html сделайте что-то вроде $(e.target).parents('.password-changer').first().html(...) (это получит ближайшего родителя с классом password-changer)

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