There are some problems in the code that is preventing it from working. One of them is the button:
<button type="clean" class="btn btn-primary mb-2 mr-3" id="limpar" onclick="limpar()">Limpar</button>
That one type="clean" does not exist in HTML specifications. As invalid, the button will work in the default type="submit", submitting the form.
That one novalidate invalidates the required. As its name suggests, it means that the fields do not need to be validated by HTML.
Change the type from the "Clear" button to button:
<button type="button" class="btn btn-primary mb-2 mr-3" id="limpar" onclick="limpar()">Limpar</button>
Also remove the ids two two buttons. When using the same name on id of an element within a form and a function, it creates conflict. If you don’t need ids, remove or change name.
In the form.addEventListener('submit', function (event) { I believe that only the preventdefault() is sufficient to prevent the form from being submitted.
In function limpar() you also need to remove the class .was-validated of form.
Let’s see it working:
<!doctype html>
<html lang="en">
<head>
<title>Ficha6</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
</head>
<body>
<div class="container">
<h1 class="mt-5 pb-3 font-weight-light">Cálculo de Escalão e IRC</h1>
<form class="needs-validation" onsubmit="calcular()">
<div class="form-group">
<label for="nomeEmpresa">Insira o nome da empresa</label>
<input type="text" class="form-control" id="nomeEmpresa" placeholder="Nome Empresa" required>
<div class="valid-feedback">
Bom nome!
</div>
</div>
<div class="form-group">
<label for="lucro">Insira o valor do lucro (euros)</label>
<input type="number" class="form-control" id="lucro" min="0" placeholder="Lucro" required>
<div class="invalid-feedback">
Insira um valor positivo!
</div>
</div>
<div class="form-group">
<label for="lucro">Escalão</label>
<input type="text" class="form-control" id="escalao" readonly>
</div>
<div class="form-group">
<label for="lucro">Taxa de IRC</label>
<input type="text" class="form-control" id="taxa" readonly>
</div>
<div class="form-group">
<label for="lucro">Valor imposto (euros)</label>
<input type="text" class="form-control" id="imposto" readonly>
</div>
<button type="button" class="btn btn-primary mb-2 mr-3" onclick="limpar()">Limpar</button>
<button type="submit" class="btn btn-primary mb-2 float-right">Calcular</button>
</form>
</div>
<!-- Optional JavaScript -->
<script>
var escaloes = ["Escalão 1", "Escalão 2", "Escalão 3"];
var taxa = ["12,5%", "25,0%", "28,0%"];
function calcular() {
var lucro = parseInt(document.getElementById("lucro").value);
if (lucro < 12500) {
document.getElementById("escalao").value = escaloes[0];
document.getElementById("taxa").value = taxa[0];
var irc = lucro * 0.125;
document.getElementById("imposto").value = irc;
} else if (lucro < 2000000) {
document.getElementById("escalao").value = escaloes[1];
document.getElementById("taxa").value = taxa[1];
var irc = lucro * 0.25;
document.getElementById("imposto").value = irc;
} else {
document.getElementById("escalao").value = escaloes[2];
document.getElementById("taxa").value = taxa[2];
var irc = lucro * 0.28;
document.getElementById("imposto").value = irc;
}
}
function limpar() {
var forms = document.getElementsByClassName('needs-validation');
// Loop over them and prevent submission
var validation = Array.prototype.filter.call(forms, function (form) {
form.classList.remove('was-validated');
});
var nada = '';
document.getElementById("escalao").value = nada;
document.getElementById("taxa").value = nada;
document.getElementById("imposto").value = nada;
document.getElementById("nomeEmpresa").value = nada;
document.getElementById("lucro").value = nada;
}
function verlucropositivo() {
var lucro = parseInt(document.getElementById("lucro").value);
}
</script>
<script>
// Example starter JavaScript for disabling form submissions if there are invalid fields
(function () {
'use strict';
window.addEventListener('load', function () {
// Fetch all the forms we want to apply custom Bootstrap validation styles to
var forms = document.getElementsByClassName('needs-validation');
// Loop over them and prevent submission
var validation = Array.prototype.filter.call(forms, function (form) {
form.addEventListener('submit', function (event) {
event.preventDefault();
form.classList.add('was-validated');
}, false);
});
}, false);
})();
</script>
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
crossorigin="anonymous"></script>
</body>
</html>
But you want to submit the form or just calculate?
– Sam
just calculate, but wanted the validations also
– Catarina Nunes