提交表单时,HTML表单未触发“submit”事件侦听器

HTML form not triggering "submit" event listener when form is submitted

提问人:Arno Nimous 提问时间:4/1/2023 最后编辑:Chris BarrArno Nimous 更新时间:4/3/2023 访问量:79

问:

我有一个事件侦听器附加到 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);
  }
};

我采取的故障排除步骤:

  1. 我验证了“submit”事件侦听器实际上附加到了表单元素 - 我可以在 Chrome 开发工具的“事件侦听器”选项卡中看到它
  2. 我验证了浏览器是否正在注册对提交按钮的点击。为此,我向 body 元素添加了一个事件侦听器,并将 event.target 发送到控制台日志。当我单击提交按钮时,浏览器会注册正在单击提交按钮,但未触发附加到表单的“submit”事件侦听器。
  3. 我在页面上测试了另一个事件侦听器,它仍然有效。不过,奇怪的是,当我点击时,我的锚点元素都没有重定向到 href——我不知道这是否与我的表单没有提交有任何关系。
HTML 表单 dom addeventlistener

评论

1赞 Dean Van Greunen 4/2/2023
删除自exportconst login
1赞 Arno Nimous 4/2/2023
谢谢你的评论!登录函数位于单独的文件(login.js)中,因此我需要导出语句。我没有在上面的代码片段中显示它,但是带有事件侦听器 (index.js) 的 JS 文件包含一个导入语句,用于从 login.js 访问登录函数。

答:

3赞 Chris Barr 4/2/2023 #1

您的代码似乎工作正常。提交表单时,我收到一个控制台语句。

请记住,在表单有效之前,不会触发提交事件!由于您在两个文本字段上都放置了属性,因此电子邮件不得为空,并且必须是自指定以来有效的电子邮件,并且密码不得为空,并且自指定以来必须至少为 8 个字符requiredtype="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 元素。删除事件侦听器后,表单正常工作。

谢谢大家的帮助!