Skip to content

Commit 7948ebc

Browse files
committed
do not re-validate on blur if already validated
In testing #76 in GitHub.com, we discovered cases where input would be re-validated on blur even if the input had not changed. This PR updates our valid and invalid code paths to only validate on blur if the input has not otherwise been already validated.
1 parent 32051d9 commit 7948ebc

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)