Skip to content

Commit 718eff9

Browse files
authored
Merge pull request #77 from github/dont-validate-on-blur-if-unchanged
do not re-validate on blur if already validated
2 parents 32051d9 + 7948ebc commit 718eff9

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

src/auto-check-element.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,19 @@ function handleChange(checker: () => void, event: Event) {
214214
const autoCheckElement = input.closest('auto-check')
215215
if (!(autoCheckElement instanceof AutoCheckElement)) return
216216

217+
if (event.type === 'input') {
218+
autoCheckElement.setAttribute('dirty', '')
219+
}
220+
217221
if (input.value.length === 0) return
218222

219223
if (
220224
(event.type !== 'blur' && !autoCheckElement.onlyValidateOnBlur) || // Existing default behavior
221-
(event.type === 'blur' && autoCheckElement.onlyValidateOnBlur) || // Only validate on blur if only-validate-on-blur is set
222-
(autoCheckElement.onlyValidateOnBlur && autoCheckElement.validateOnKeystroke) // Only validate on key inputs in only-validate-on-blur mode if validate-on-keystroke is set (when input is invalid)
225+
(event.type === 'blur' &&
226+
autoCheckElement.onlyValidateOnBlur &&
227+
!autoCheckElement.validateOnKeystroke &&
228+
autoCheckElement.hasAttribute('dirty')) || // Only validate on blur if only-validate-on-blur is set, input is dirty, and input is not current validating on keystroke
229+
(event.type === 'input' && autoCheckElement.onlyValidateOnBlur && autoCheckElement.validateOnKeystroke) // Only validate on key inputs in only-validate-on-blur mode if validate-on-keystroke is set (when input is invalid)
223230
) {
224231
setLoadingState(event)
225232
checker()
@@ -326,6 +333,8 @@ async function check(autoCheckElement: AutoCheckElement) {
326333

327334
state.controller = makeAbortController()
328335

336+
autoCheckElement.removeAttribute('dirty')
337+
329338
try {
330339
const response = await fetchWithNetworkEvents(autoCheckElement, url.toString(), {
331340
credentials: 'same-origin',

test/auto-check.js

+29
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ describe('auto-check element', function () {
6060
assert.deepEqual(events, ['auto-check-start'])
6161
})
6262

63+
it('does not emit on blur if input has not changed after initial blur', async function () {
64+
const events = []
65+
input.addEventListener('auto-check-start', event => events.push(event.type))
66+
triggerInput(input, 'hub')
67+
triggerBlur(input)
68+
69+
await once(input, 'auto-check-complete')
70+
triggerBlur(input)
71+
72+
assert.deepEqual(events, ['auto-check-start'])
73+
})
74+
6375
it('emits on input change if input is invalid after blur', async function () {
6476
const events = []
6577
input.addEventListener('auto-check-start', event => events.push(event.type))
@@ -74,6 +86,23 @@ describe('auto-check element', function () {
7486
assert.deepEqual(events, ['auto-check-start', 'auto-check-start', 'auto-check-start'])
7587
})
7688

89+
it('does not emit on blur if input is invalid', async function () {
90+
const events = []
91+
input.addEventListener('auto-check-start', event => events.push(event.type))
92+
93+
checker.src = '/fail'
94+
triggerInput(input, 'hub')
95+
triggerBlur(input)
96+
await once(input, 'auto-check-complete')
97+
98+
triggerInput(input, 'hub2')
99+
triggerBlur(input)
100+
101+
triggerInput(input, 'hub3')
102+
103+
assert.deepEqual(events, ['auto-check-start', 'auto-check-start', 'auto-check-start'])
104+
})
105+
77106
afterEach(function () {
78107
document.body.innerHTML = ''
79108
checker = null

0 commit comments

Comments
 (0)