提问人:Arno Nimous 提问时间:4/1/2023 最后编辑:Chris BarrArno Nimous 更新时间:4/3/2023 访问量:79
提交表单时,HTML表单未触发“submit”事件侦听器
HTML form not triggering "submit" event listener when form is submitted
问:
我有一个事件侦听器附加到 HTML 表单元素,但是当我单击提交表单的按钮或按“Enter”时,该侦听器不会被触发。
下面是 HTML:
<main class="main">
<div class="login-form">
<h2 class="heading-secondary ma-bt-lg">Log into your account</h2>
<form class="form" id="loginform">
<div class="form__group">
<label class="form__label" for="email">Email address</label>
<input class="form__input" id="email" type="email" placeholder="[email protected]" required="required"/>
</div>
<div class="form__group ma-bt-md">
<label class="form__label" for="password">Password</label>
<input class="form__input" id="password" type="password" placeholder="••••••••" required="required" minlength="8"/>
</div>
<div class="form__group">
<button class="btn btn--green" type="submit">Login</button>
</div>
</form>
</div>
</main>
下面是事件侦听器 JS 代码:
const loginForm = document.getElementById('loginform');
if (loginForm) {
loginForm.addEventListener('submit', (e) => {
e.preventDefault();
console.log('Hello from the login event listener');
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
login(email, password);
});
}
这是函数的JS代码,它是从另一个文件导入的:login(email, password)
export const login = async (email, password) => {
try {
const res = await axios({
method: 'POST',
url: 'http://127.0.0.1:8000/api/v1/users/login',
data: {
email,
password,
},
});
if (res.data.status === 'success') {
showAlert('success', 'Logged in successfully!');
window.setTimeout(() => {
location.assign('/home');
}, 1500);
}
} catch (err) {
showAlert('error', err.response.data.message);
}
};
我采取的故障排除步骤:
- 我验证了“submit”事件侦听器实际上附加到了表单元素 - 我可以在 Chrome 开发工具的“事件侦听器”选项卡中看到它
- 我验证了浏览器是否正在注册对提交按钮的点击。为此,我向 body 元素添加了一个事件侦听器,并将 event.target 发送到控制台日志。当我单击提交按钮时,浏览器会注册正在单击提交按钮,但未触发附加到表单的“submit”事件侦听器。
- 我在页面上测试了另一个事件侦听器,它仍然有效。不过,奇怪的是,当我点击时,我的锚点元素都没有重定向到 href——我不知道这是否与我的表单没有提交有任何关系。
答:
3赞
Chris Barr
4/2/2023
#1
您的代码似乎工作正常。提交表单时,我收到一个控制台语句。
请记住,在表单有效之前,不会触发提交事件!由于您在两个文本字段上都放置了属性,因此电子邮件不得为空,并且必须是自指定以来有效的电子邮件,并且密码不得为空,并且自指定以来必须至少为 8 个字符required
type="email"
minlength="8"
const loginForm = document.getElementById('loginform');
if (loginForm) {
loginForm.addEventListener('submit', (e) => {
e.preventDefault();
console.log('Hello from the login event listener');
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
//login(email, password);
});
}
<main class="main">
<div class="login-form">
<h2 class="heading-secondary ma-bt-lg">Log into your account</h2>
<form class="form" id="loginform">
<div class="form__group">
<label class="form__label" for="email">Email address</label>
<input class="form__input" id="email" type="email" placeholder="[email protected]" required="required"/>
</div>
<div class="form__group ma-bt-md">
<label class="form__label" for="password">Password</label>
<input class="form__input" id="password" type="password" placeholder="••••••••" required="required" minlength="8"/>
</div>
<div class="form__group">
<button class="btn btn--green" type="submit">Login</button>
</div>
</form>
</div>
</main>
评论
2赞
Arno Nimous
4/2/2023
谢谢你的评论!知道代码对您来说运行良好是非常有帮助的。在尝试提交表单之前,我确实确保电子邮件和密码字段包含有效条目,但它仍然对我不起作用。但是,如果它对您有用,那么我需要考虑我摘录的代码之外的原因。
1赞
Chris Barr
4/3/2023
检查我上面回答中的片段。这就是我让它工作得很好的地方
0赞
Arno Nimous
4/3/2023
#2
我弄清楚了问题所在。这对我来说是一个愚蠢的错误。在诊断另一个问题时,我在 body 元素中添加了一个事件侦听器,以便我可以验证在单击各种 DOM 元素时是否正在生成单击事件(并查看它们生成的位置)。但。。。我在该事件侦听器中包含了一个 event.preventDefault() 语句,该语句关闭了正在单击的任何内容的默认行为 - 包括 form 元素。删除事件侦听器后,表单正常工作。
谢谢大家的帮助!
评论
export
const login