#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 приятно это слышать.