Я пытаюсь создать форму для 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();
});
}
Я хочу задать несколько вопросов:
Можете ли вы перевести свои комментарии на английский?
Я перевел комментарии на английский



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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 для элемента формы и соответствующие классы проверки для входных данных формы.
Большое спасибо. Оно работает. Вы все классные ребята, я учусь у вас каждый день, спасибо.
Я не уверен, почему вы делаете такие вещи, также можно установить простые проверки, если вы вставите в них необходимое.
Да, вы можете сделать намного проще, чем это.
И да, вы можете использовать для этого classes или id.
ids — гораздо более простые и уникальные сущности. Вы можете установить атрибут disabled или скрыть эту кнопку от простого стиля с помощью display:none;
Идея именно такая: 1) делаю POST-запрос; 2) Запрос на публикацию проходит, если форма действительна (все поля заполнены). 3) Запрос на публикацию не проходит, если форма недействительна (некоторые поля пусты). Требуется использование начальной загрузки браузера по умолчанию.
Вы реагируете на событие нажатия на кнопку отправки и предотвращаете действие этого события по умолчанию (отправку формы), поэтому проверка формы никогда не сработает. Если в вашей форме нет других кнопок отправки (которые должны делать что-то другое), просто привяжите ее к событию
submitформы. Если вам нужно по-разному обрабатывать разные кнопки, вам нужно самостоятельно запустить проверку (с помощью методаcheckValidityформы.)