欢迎访问宙启技术站
智能推送

基于JavaScript实现带数据验证和复选框的表单提交

发布时间:2023-05-14 13:35:10

表单是Web应用程序中必不可少的元素之一,用于收集来自用户的输入数据。在现代Web应用中,表单具有许多更复杂和高级的功能,例如数据验证和复选框。

本文将介绍如何使用JavaScript实现带数据验证和复选框的表单提交。我们将用一些简单的HTML和JavaScript代码作为基础,然后逐步添加更多的功能来实现我们的目标。最终,我们将把所有的代码整合到一起,以便最终功能可以正常运行。

要开始构建带数据验证和复选框的表单提交,我们需要首先创建一个基本的HTML表单。以下是我们将要使用的HTML代码:

    <form method="post" action="#" id="myForm">

      <div>

        <label for="fullName">Full Name:</label>

        <input type="text" id="fullName" name="fullName">

      </div>

      <div>

        <label for="email">Email:</label>

        <input type="text" id="email" name="email">

      </div>

      <div>

        <label for="password">Password:</label>

        <input type="password" id="password" name="password">

      </div>

      <div>

        <label for="confirmPassword">Confirm Password:</label>

        <input type="password" id="confirmPassword" name="confirmPassword">

      </div>

      <div>

        <label for="newsletter">Subscribe to Newsletter:</label>

        <input type="checkbox" id="newsletter" name="newsletter">

      </div>

      <div>

        <input type="submit" value="Submit" id="submitBtn">

      </div>

    </form>

我们的基本表单包含用户需要填写的四个输入字段:Full Name、Email、Password以及Confirm Password。我们还添加了一个复选框,用于让用户选择是否订阅我们的新闻简报。最后,我们添加了一个提交按钮。

我们的表单现在没有任何数据验证或复选框交互。我们需要添加一些JavaScript代码来实现这些功能。

首先,我们将实现数据验证功能。

我们需要为每个输入字段编写一个验证函数。这些函数将检查输入字段是否为空或格式是否正确。这些验证函数可以用正则表达式来实现。

以下是我们将要使用的JavaScript代码:

    function validateFullName() {

      const fullName = document.getElementById("fullName");

      const fullNameValue = fullName.value;

      if (fullNameValue.trim() === "") {

        fullName.setCustomValidity("Full Name is required");

        return false;

      } else {

        fullName.setCustomValidity("");

        return true;

      }

    }

    function validateEmail() {

      const email = document.getElementById("email");

      const emailValue = email.value;

      // Regular expression for email validation

      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

      if (!emailValue.match(emailRegex)) {

        email.setCustomValidity("Invalid email format");

        return false;

      } else {

        email.setCustomValidity("");

        return true;

      }

    }

    function validatePassword() {

      const password = document.getElementById("password");

      const passwordValue = password.value;

      // Regular expression for password validation

      const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/;

      if (!passwordValue.match(passwordRegex)) {

        password.setCustomValidity("Password must be at least 8 characters long, and contain at least one uppercase letter, one lowercase letter, and one number.");

        return false;

      } else {

        password.setCustomValidity("");

        return true;

      }

    }

    function validateConfirmPassword() {

      const confirmPassword = document.getElementById("confirmPassword");

      const confirmPasswordValue = confirmPassword.value;

      const password = document.getElementById("password");

      const passwordValue = password.value;

      if (confirmPasswordValue !== passwordValue) {

        confirmPassword.setCustomValidity("Passwords do not match");

        return false;

      } else {

        confirmPassword.setCustomValidity("");

        return true;

      }

    }

在这些函数中,我们首先获取每个输入字段的元素。然后,我们检查输入字段的值是否满足要求。如果输入字段的值不符合要求,则我们会使用setCustomValidity()方法来设置一条错误消息。否则,我们会将输入字段的自定义有效性设置为空,并返回true。

有了这些验证函数,我们需要在表单提交时调用它们。我们将使用submit事件来调用这些函数。这意味着在用户单击提交按钮时,我们将检查每个输入字段的值是否有效。如果有一个或多个值不符合要求,则我们将阻止表单提交。

以下是我们将要使用的JavaScript代码:

    const myForm = document.getElementById("myForm");

    myForm.addEventListener("submit", function(event) {

      const isFullNameValid = validateFullName();

      const isEmailValid = validateEmail();

      const isPasswordValid = validatePassword();

      const isConfirmPasswordValid = validateConfirmPassword();

      if (!isFullNameValid || !isEmailValid || !isPasswordValid || !isConfirmPasswordValid) {

        event.preventDefault();

      }

    });

在这个代码中,我们首先获取表单元素。然后,我们使用addEventListener()方法来附加submit事件处理程序。在事件处理程序中,我们调用每个验证函数并将其返回值存储在一个布尔变量中。最后,我们检查这些布尔值是否全部为true。如果有任何一个布尔值为false,则我们使用preventDefault()方法阻止表单提交。

现在我们的表单具有数据验证功能。下一步是实现复选框交互。

我们将在submit事件处理程序中实现复选框交互。如果复选框已选中,则我们将在表单数据中添加一些附加值。这些值将告诉我们应该订阅哪个新闻简报。

以下是我们将要使用的JavaScript代码:

    myForm.addEventListener("submit", function(event) {

      const isFullNameValid = validateFullName();

      const isEmailValid = validateEmail();

      const isPasswordValid = validatePassword();

      const isConfirmPasswordValid = validateConfirmPassword();

      if (!isFullNameValid || !isEmailValid || !isPasswordValid || !isConfirmPasswordValid) {

        event.preventDefault();

        return;

      }

      const newsletterInput = document.getElementById("newsletter");

      const newsletterValue = newsletterInput.checked ? "yes" : "no";

      const formData = new FormData(myForm);

      formData.append("newsletter", newsletterValue);

      event.preventDefault();

      const xhr = new XMLHttpRequest();

      xhr.open("POST", myForm.action);

      xhr.send(formData);

    });

在这个代码中,我们首先调用每个验证函数来确保所有输入字段都已设置为有效。如果有任何一个输入字段无效,则我们使用preventDefault()方法来阻止表单提交。否则,我们获取复选框的元素并检查它是否已选中。如果已选中,则我们将newsletter字段的值设置为“yes”,否则设置为“no”。

接下来,我们创建一个FormData对象来包含表单数据。我们使用append()方法将newsletter字段及其值添加到FormData对象中。

最后,我们使用XMLHttpRequest对象来将FormData对象发送到服务器。发送请求后,我们阻止表单提交。

现在我们已经成功地实现了带数据验证和复选框交互的表单提交。整合所有的代码,我们得到以下完整的HTML和JavaScript代码:

    <!DOCTYPE html>

    <html>

    <head>

      <meta charset="utf-8">

      <title>Form Validation and Checkbox Interaction</title>

    </head>

    <body>

      <form method="post" action="#" id="myForm">

        <div>

          <label for="fullName">Full Name:</label>

          <input type="text" id="fullName" name="fullName">

        </div>

        <div>

          <label for="email">Email:</label>

          <input type="text" id="email" name="email">

        </div>

        <div>

          <label for="password">Password:</label>

          <input type="password" id="password" name="password">

        </div>

        <div>

          <label for="confirmPassword">Confirm Password:</label>

          <input type="password" id="confirmPassword" name="confirmPassword">

        </div>

        <div>

          <label for="newsletter">Subscribe to Newsletter:</label>

          <input type="checkbox" id="newsletter" name