Before submitting a form the user clicks a button to open a “confirm” modal. When pressing “Apply” in the modal client-side validation fires and validates all fields. So far so good, but if validation fails the modal does not close and I cannot work out how.
I have tried to attach an eventhandler to the submit button and then call myModal.hide(), but nothing happens. I suspect some other bootstrap js code is in conflict, but I cannot work out what to do?
I have manually tried to revert .show() by removing classes from and modal-backdrop, but then I end up preventing the modal to load again (after correction of the validation mistakes)
I’m using Bootstrap 5, beta 3.
<form method="post"> <div class="mb-1"> <div class="form-floating pb-0"> <input type="text" class="form-control" asp-for="Input.Title" placeholder="Title"> <label asp-for="Input.Title">Event title</label> </div> <span asp-validation-for="Input.Title" class="text-danger"></span> </div> <button type="button" class="btn" data-bs-toggle="modal" data-bs-target="#confirmStaticModal"> <div class="modal fade" id="confirmStaticModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="confirmStaticModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="confirmStaticModalLabel">Apply</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <p>Are you sure?</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Cancel</button> <input type="submit" class="btn btn-success" value="Apply" id="confirmApplicationButton" /> </div> </div> </div> </div> </form>
JS Code to add event handler
document.getElementById("confirmApplicationButton").addEventListener("click", (event) => { var modal = new bootstrap.Modal(document.getElementById("confirmStaticModal")); modal.hide(); });
Advertisement
Answer
By using new bootstrap.Modal()
in this way, you’re creating an additional, new Bootstrap modal using elements from a pre-existing Bootstrap modal. Having two different modals attached to the same HTML elements causes a conflict.
The correct way to get a reference to an already created modal is via .getInstance() as in:
var modal = bootstrap.Modal.getInstance(document.getElementById("confirmStaticModal"));