Одной альтернативой для достижения вашей цели является использование набора стандартных pseudo-classes
, таких как : недействительные и : действительные .Также обратите внимание, что мы собираемся использовать некоторые методы и функции массива, такие как Array.some () и Spread Syntax :
var form = document.querySelector('form');
function detectChange()
{
var invalids = form.querySelectorAll('input:invalid');
var valids = form.querySelectorAll('input:valid');
return (invalids.length > 0) || [...valids].some(i => i.defaultValue !== i.value);
}
form.querySelector('button').addEventListener('click', function()
{
if (detectChange() && confirm('Are you sure you want to reset?'))
form.reset();
});
<form>
<input type="number">
<input type="number">
<input type="number" value="7">
<button type="button">Reset</button>
</form>
Если вы можете использовать placeholders
на своем inputs
, то другим возможным решением является использование псевдокласса CSS : указывается заполнитель .Тем не менее, проверьте поддержку браузера , чтобы убедиться, что он будет соответствовать вашим потребностям.Обратите внимание, что экспериментальный и не рекомендуется для использования на производстве.Затем вы можете использовать следующие selector
:
input:not(:placeholder-shown)
, чтобы получить все входы, где placeholder
не отображается, т. Е. Все непустые входы, и повторнореализовать свой код примерно так:
var form = document.querySelector('form');
function detectChange()
{
var inputs = form.querySelectorAll(
'input:not([value]):not(:placeholder-shown), input[value]'
);
return [...inputs].some(i => !i.defaultValue || i.defaultValue !== i.value);
}
form.querySelector('button').addEventListener('click', function()
{
if (detectChange() && confirm('Are you sure you want to reset?'))
form.reset();
});
<form>
<input type="number" placeholder="Insert a number">
<input type="number" placeholder="Insert a number">
<input type="number" value="7" placeholder="Insert a number">
<button type="button">Reset</button>
</form>