Вы должны быть осторожны с тем, какое событие вы используете с <input type="date">
, чтобы избежать непредвиденных последствий.События input
и change
могут сработать, как только пользователь введет любую цифру в последнем пустом разделе даты (не обязательно одинаково для всех браузеров из-за нечеткой поддержки <input type="date">
).
ДляНапример (в Chrome), если пользователь вводит «12» в качестве месяца, «31» в качестве даты, а затем вводит «2» в году (с намерением ввести «2018»), input
иchange
события сработают, как только будет введено «2», и в вашем сценарии функция проверки затем сравнит «31.12.2000» с другой датой, прежде чем пользователь закончит вводить год (и это будет происходить многократно, так какпользователь пытается ввести оставшиеся цифры года).Вы можете обойти это изящно в зависимости от того, как вы уведомите пользователя о результатах проверки, но это будет не очень красиво, если вы используете alert()
.
. По этой причине может быть безопаснее использоватьсобытие, подобное blur
, для запуска сравнения проверки.Что-то вроде:
const since = document.querySelector('#since');
const until = document.querySelector('#until');
const message = document.querySelector('#message');
const compareDates = () => {
let sval = since.value;
let uval = until.value;
if (sval && uval && (uval < sval)) {
message.innerHTML = 'The "Until" date must come after the "Since" date.';
} else {
message.innerHTML = '';
}
}
since.addEventListener('blur', compareDates);
until.addEventListener('blur', compareDates);
#message {
margin: 8px 0;
color: red;
}
<label for="since">Since</label>
<input type="date" name="since" id="since" required>
<label for="until">Until</label>
<input type="date" name="until" id="until" required>
<div id="message"></div>