У меня есть отправка формы, которая вызывает API, например
<button
class = "btn btn-primary w-100"
data-bs-toggle = "modal"
data-bs-target = "#exampleModal"
onclick = "Send();"
>
Invia
</button>
Где находится функция Send()
function Send() {
var select_file = document.getElementById("formFile").files[0];
var select_project_name = document.getElementById("selec-div").value;
var pacchetto_id = document.getElementById("pacchetto").value;
var versione_id = document.getElementById("versione").value;
var file_string =
"https://<xxxx>.it/api/;
console.info(file_string);
var formData = new FormData();
formData.append("file", select_file);
fetch(file_string, {
method: "PUT",
headers: {
"PRIVATE-TOKEN": TOKEN,
},
body: formData,
})
.then((response) => response.json())
.then((data) => {
console.info("File uploaded successfully:", data);
if (data["message"] == "201 Created") {
modal.show();
}
})
.catch((error) => {
console.error("Error uploading file:", error);
});
}
Моя проблема в том, что модальное окно открывается сразу после того, как я нажал кнопку, а не отображается после data["message"] == "201 Created"
.
По сути, даже если я вижу console.info("File uploaded successfully:", data);
, когда файл действительно загружен, вместо этого модальное окно отображается сразу после нажатия кнопки.
Вам необходимо удалить атрибуты data-bs-*
из button
, поскольку они автоматически запускают модальное окно и показывать/скрывать модальное окно только с помощью JS:
<button
class = "btn btn-primary w-100"
onclick = "Send();"
>
Invia
</button>
Модальный экземпляр JS:
const modal = new bootstrap.Modal('#exampleModal');
демо:
<!doctype html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1">
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet">
<link href = "https://getbootstrap.com/docs/5.3/assets/css/docs.css" rel = "stylesheet">
<title>Bootstrap Example</title>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class = "p-3 m-0 border-0 bd-example m-0 border-0">
<!-- Example Code -->
<form abineguid = "06622E9DA1A84EF183141C48C5CDF885">
<div class = "mb-3">
<label for = "recipient-name" class = "col-form-label">Recipient:</label>
<input type = "text" class = "form-control" id = "recipient-name">
</div>
<div class = "mb-3">
<label for = "message-text" class = "col-form-label">Message:</label>
<textarea class = "form-control" id = "message-text"></textarea>
</div>
<button
class = "btn btn-primary w-100"
onclick = "Send(event);"
>
Invia
</button>
</button>
</form>
<!-- Modal -->
<div class = "modal fade" id = "exampleModal" tabindex = "-1" aria-labelledby = "exampleModalLabel" aria-hidden = "true">
<div class = "modal-dialog">
<div class = "modal-content">
<div class = "modal-header">
<h1 class = "modal-title fs-5" id = "exampleModalLabel">Modal title</h1>
<button type = "button" class = "btn-close" data-bs-dismiss = "modal" aria-label = "Close"></button>
</div>
<div class = "modal-body">
...
</div>
<div class = "modal-footer">
<button type = "button" class = "btn btn-secondary" data-bs-dismiss = "modal">Close</button>
<button type = "button" class = "btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
<script>
const modal = new bootstrap.Modal('#exampleModal');
function Send(e) {
e.preventDefault()
var file_string = "https://jsonplaceholder.typicode.com/todos";
console.info(file_string);
fetch(file_string)
.then((response) => response.json())
.then((data) => {
console.info("File uploaded successfully:", data);
setTimeout(()=>{
modal.show();
}, 1000);
})
.catch((error) => {
console.error("Error uploading file:", error);
});
}
</script>
</body>
</html>