Проверка формы не удалась

Я пытаюсь создать форму для POST для нового пользователя, но возникла проблема. Я использую проверку формы начальной загрузки (по умолчанию в браузере). Есть кнопка:

<button class = "btn btn-primary btn-addUser" type = "submit">Add User</button>

Эта кнопка также имеет функцию создания нового поста на основе данных из входа:

const addUsersBtn = document.querySelector(".btn-addUser");

// post add button in html
addUsersBtn.addEventListener("click", postNewUser);

// Post a user
function postNewUser(e) {
  e.preventDefault();
  // write value from form inputs
  const name = form.elements.namedItem("name").value;
  const username = form.elements.namedItem("username").value;
  const email = form.elements.namedItem("email").value;
  const phone = form.elements.namedItem("phone").value;
  const website = form.elements.namedItem("website").value;

  // create our user object from data recorded in variables from form inputs
  const newPost = {
    name: name,
    username: username,
    email: email,
    phone: phone,
    website: website,
    user_id: `id_${Math.random() * Math.random()}`,
  };

  // create a post
  createPost(newPost, (response) => {
    const card = newPostTemplate(response);
    container.insertAdjacentElement("afterbegin", card);
    form.reset();
    initPopovers();
  });
}

Но если я использую функцию проверки postNewUser, она не работает. Если я удалю класс «btn-addUser» из проверки кнопок, работа будет работать. Мой код из файла addUser.js:

// получаем нашу форму
const form = document.forms["addUser"];
// create a “create post” function
function createPost(body, callback) {
  return new Promise((resolve, reject) => {
    const request = new XMLHttpRequest();
    request.open("POST", "https://jsonplaceholder.typicode.com/posts");
    request.addEventListener("load", () => {
      const response = JSON.parse(request.responseText);
      //   console.info(response);
      if (request.status >= 400) {
        reject(request.response);
      } else {
        resolve(request.response);
      }
      callback(response);
    });
    request.setRequestHeader("Content-type", "application/json; charset=UTF-8");
    request.send(JSON.stringify(body));
  });
}
// template for the post in which it will be built
function newPostTemplate(post) {
  const card = document.createElement("div");
  card.classList.add("card");

  const cardBody = document.createElement("div");
  cardBody.classList.add("card-body");

  const userBtn = document.createElement("button");
  userBtn.setAttribute("type", "button");
  userBtn.classList.add("btn", "btn-info", "btn-lg");
  userBtn.setAttribute("data-bs-toggle", "popover");
  userBtn.setAttribute("data-bs-html", "true");
  userBtn.setAttribute(
    "data-bs-title",
    "Additional information about the user: "
  );
  userBtn.setAttribute(
    "data-bs-content",
    `Username: ${post.username}<br/>Email: ${post.email}<br/>Phone: ${post.phone}<br/> Website: ${post.website}`
  );
  const title = document.createElement("h5");
  title.classList.add("card-title");
  title.textContent = post.name;

  userBtn.appendChild(title);
  cardBody.appendChild(userBtn);
  card.appendChild(cardBody);
  return card;
}
// button to add post in html
addUsersBtn.addEventListener("click", postNewUser);
// function Post user
function postNewUser(e) {
  e.preventDefault();
  // write value from form inputs
  const name = form.elements.namedItem("name").value;
  const username = form.elements.namedItem("username").value;
  const email = form.elements.namedItem("email").value;
  const phone = form.elements.namedItem("phone").value;
  const website = form.elements.namedItem("website").value;
  // create our user object from data recorded in variables from form inputs
  const newPost = {
    name: name,
    username: username,
    email: email,
    phone: phone,
    website: website,
    user_id: `id_${Math.random() * Math.random()}`,
  };
  // create a post
  createPost(newPost, (response) => {
    const card = newPostTemplate(response);
    container.insertAdjacentElement("afterbegin", card);
    form.reset();
    initPopovers();
  });
}

Я хочу задать несколько вопросов:

  1. Могу ли я создать две кнопки: первую кнопку без класса «btn-addUser» и вторую кнопку с классом «btn-addUser»? Я хочу добавить состояние отключенной кнопки (начальная загрузка) и удалить их при отправке без того, чтобы класс btn-addUser получил положительный ответ от проверки. После нажатия кнопки «btn-addUser» эта кнопка будет отключена. Это правда? Я не знаю, как получить положительный ответ от проверки.
  2. А может я фигню делаю и можно сделать гораздо проще?

Вы реагируете на событие нажатия на кнопку отправки и предотвращаете действие этого события по умолчанию (отправку формы), поэтому проверка формы никогда не сработает. Если в вашей форме нет других кнопок отправки (которые должны делать что-то другое), просто привяжите ее к событию submit формы. Если вам нужно по-разному обрабатывать разные кнопки, вам нужно самостоятельно запустить проверку (с помощью метода checkValidity формы.)

CBroe 10.06.2024 11:30

Можете ли вы перевести свои комментарии на английский?

JaB 11.06.2024 08:52

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

Yaroslav Demchenko 12.06.2024 15:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

e.preventDefault() в обработчике события отправки, скорее всего, не позволяет браузеру автоматически выполнять встроенные проверки при попытке отправки формы. Вы должны вручную проверить, действительна ли форма, используя form.checkValidity() следующим образом:

function postNewUser(e) {
  e.preventDefault();

  if (form.checkValidity()) {
    // Form is valid, proceed with creating the new user
    // Add your custom logic here
  } else {
    // Form is invalid, trigger validation UI
    // form.classList.add("was-validated");
  }
}

Убедитесь, что ваша форма имеет необходимые атрибуты и классы проверки Bootstrap, такие как novalidate для элемента формы и соответствующие классы проверки для входных данных формы.

Большое спасибо. Оно работает. Вы все классные ребята, я учусь у вас каждый день, спасибо.

Yaroslav Demchenko 10.06.2024 12:35

Я не уверен, почему вы делаете такие вещи, также можно установить простые проверки, если вы вставите в них необходимое. Да, вы можете сделать намного проще, чем это. И да, вы можете использовать для этого classes или id. ids — гораздо более простые и уникальные сущности. Вы можете установить атрибут disabled или скрыть эту кнопку от простого стиля с помощью display:none;

Идея именно такая: 1) делаю POST-запрос; 2) Запрос на публикацию проходит, если форма действительна (все поля заполнены). 3) Запрос на публикацию не проходит, если форма недействительна (некоторые поля пусты). Требуется использование начальной загрузки браузера по умолчанию.

Yaroslav Demchenko 13.06.2024 02:46

Другие вопросы по теме