So with this code I'm trying (not done by me but it's a bit different) to do a date of birth select with 3 selects, 1 for day, 1 for month and 1 for year, but whenever the user chooses for ex 30 for day and then chooses February it displays an error using setCustomValidity and reportValidity but it does not work when I choose 29 day then February then choose a non leap year like 2022, its does not show the error.
var Days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // index => month [0-11]
$(document).ready(function() {
var option = '<option id="dayOption" selected disabled value="day">Day</option>';
var selectedDay = "day";
for (var i = 1; i <= Days[0]; i++) { //add option days
option += '<option value="' + i + '">' + i + '</option>';
}
$('#day').append(option);
$('#day').val(selectedDay);
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var option = '<option selected disabled value="month">Month</option>';
var selectedMon = "month";
for (var i = 1; i <= 12; i++) {
option += '<option value="' + i + '">' + months[i - 1] + '</option>';
}
$('#month').append(option);
$('#month').val(selectedMon);
var d = new Date();
var option = '<option selected disabled value="year">Year</option>';
selectedYear = "year";
for (var i = d.getFullYear(); i >= 1910; i--) { // years start i
option += '<option value="' + i + '">' + i + '</option>';
}
$('#year').append(option);
$('#year').val(selectedYear);
});
function isLeapYear(year) {
if (year == "year") {
return true;
} else {
year = parseInt(year);
if (year % 4 != 0) {
return false;
} else if (year % 400 == 0) {
return true;
} else if (year % 100 == 0) {
return false;
} else {
return true;
}
}
}
function change_month(select) {
var day = $('#day');
var val = $(day).val();
$(day).empty();
var option = '<option id="dayOption" selected disabled value="day">Day</option>';
var month = parseInt($(select).val()) - 1;
for (var i = 1; i <= Days[month]; i++) { //add option days
if (val == i) {
option += '<option selected value="' + i + '">' + i + '</option>';
} else {
option += '<option value="' + i + '">' + i + '</option>';
}
}
$(day).append(option);
if (val > Days[month]) {
dayOption = $('#dayOption');
dayOption.removeAttr("disabled", false);
dayOption.removeAttr("selected", false);
dayOption.attr("selected", true);
dayOption.attr("disabled", true);
day.get(0).setCustomValidity("Wrong day");
day.get(0).reportValidity();
} else {
day.get(0).setCustomValidity("");
}
}
function change_year(select) {
if (isLeapYear($(select).val())) {
Days[1] = 29;
} else {
Days[1] = 28;
}
month = $("#month").val();
if (month == 2) {
var day2 = $('#day');
var val = $(day).val();
$(day2).empty();
var option = '<option id="dayOption" selected disabled value="day">Day</option>';
for (var i = 1; i <= Days[1]; i++) { //add option days
if (val == i) {
option += '<option selected value="' + i + '">' + i + '</option>';
} else {
option += '<option value="' + i + '">' + i + '</option>';
}
}
$(day2).append(option);
if (month > Days[1]) {
day2.get(0).setCustomValidity("Wrong day");
day2.get(0).reportValidity();
dayOption = $('#dayOption');
dayOption.removeAttr("disabled", false);
dayOption.removeAttr("selected", false);
dayOption.attr("selected", true);
dayOption.attr("disabled", true);
} else {
day2.get(0).setCustomValidity("");
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<form class="container">
<SELECT id="day" name="dd"></SELECT>
<SELECT id="month" name="mm" onchange="change_month(this)"></SELECT>
<SELECT id="year" name="yyyy" onchange="change_year(this)"></SELECT>
</form>