Странное поведение событий нажатия и ввода для элемента кнопки внутри формы

#javascript #html #css

#язык JavaScript #HTML #CSS

Вопрос:

Рассмотрим login.html файл, такой как следующий:

 lt;bodygt; lt;div class="container"gt;  lt;form class="form"gt;  lt;h1gt;Loginlt;/h1gt;  lt;input type="text" class="form__input" name="username" autofocus placeholder="Username" /gt;  lt;input type="password" class="form__input" name="password" placeholder="Password" /gt;  lt;button class="form__button" type="submit"gt;Loginlt;/buttongt;  lt;/formgt; lt;/divgt; lt;/bodygt;  

Я заметил немного странное поведение с кнопкой:

Когда я нахожусь в поле пароля и нажимаю «Ввод», запускается событие нажатия кнопки, как если бы я на самом деле нажимал на кнопку. К сожалению, и это сбивает с толку, кажется, что это происходит не каждый раз. Разница с фактическим нажатием на кнопку заключается в том, что фокус не берется из поля пароля. Поскольку у меня есть прослушиватель событий размытия, прикрепленный к моему полю пароля, я хотел бы, чтобы событие нажатия «Enter» вело себя так же, как если бы я действительно нажал на кнопку.

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

Выдержка из моего JavaScript:

 document.addEventListener("DOMContentLoaded", () =gt; {  const submitButton = document.querySelector(".form__button");  const passwordInputField = document.querySelector("#password");   submitButton.addEventListener("click", e =gt; {  e.preventDefault();  console.log("inside submitButton click event handler");  });   passwordInputField.addEventListener("blur", e =gt; {  console.log("passwordInputField lost focus");  });   passwordInputField.addEventListener("keyup", e =gt; {  if (e.keyCode === 13) {  console.log("keyup event triggered from inside passwordInputField");  submitButton.focus();  submitButton.click();  }  });  

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

 inside submitButton click event handler keyup event triggered from inside passwordInputField passwordInputField lost focus inside submitButton click event handler  

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

1. Зависит от кода задания, который вы добавляете, это не должно быть из обычного html, пожалуйста, просмотрите свой код js

Ответ №1:

 let form_element = document.querySelector('#form')  form.addEventListener('submit',(e) =gt; {  e.preventDefault();  let button_element = document.querySelector('#button')  button_element.focus() }) // now here you have to add click handler to the button for form submittion 
 button:focus{  background-color:green;  } 
 lt;form class="form" id="form"gt;  lt;h1gt;Loginlt;/h1gt;  lt;input type="text" class="form__input" name="username" autofocus placeholder="Username" /gt;  lt;input type="password" class="form__input" name="password" placeholder="Password" /gt;  lt;button id="button" class="form__button" type="submit"gt;Loginlt;/buttongt; lt;/formgt; 

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

1. Спасибо за твой ответ, Алан Омар! Я пробовал это решение, но, похоже, нажатие на ввод внутри поля пароля заранее запускает какое-то событие, а не событие отправки, я это проверил.

2. @Luk какие события запускаются, когда вы нажимаете Enter на поле с паролем?

3. вот чего я не знаю. Я только что прочитал, что кнопка типа отправить на самом деле всегда запускает событие отправки формы, частью которой она является. Поэтому я добавил прослушиватель отправки в форму, которая предотвращает событие по умолчанию и выводит сообщение на консоль. Но форма все еще отправлена, и я не вижу никаких выходных данных в своей консоли. Поэтому я не думаю, что событие отправки срабатывает.

4. @Luk можете ли вы быть более точным в том, чего вы добиваетесь, мой ответ был основан на том, что я понимаю в вашем вопросе.

5. @Luk приятно это слышать.