Skip to content

Commit e49e30d

Browse files
authored
Add manual validation trigger
1 parent 77df846 commit e49e30d

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ input.addEventListener('auto-check-complete', function(event) {
139139
[CSRF]: https://en.wikipedia.org/wiki/Cross-site_request_forgery
140140
[Response]: https://developer.mozilla.org/en-US/docs/Web/API/Response
141141
142+
## Manually Trigger Validation
143+
144+
The `triggerValidation()` function can be used to manually tigger the `<auto-check>` element.
145+
146+
```js
147+
document.getElementById('input-element').closest('auto-check').triggerValidation()
148+
```
149+
142150
## Browser support
143151
144152
Browsers without native [custom element support][support] require a [polyfill][].

custom-elements.json

+9
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@
155155
"kind": "field",
156156
"name": "onloadend"
157157
},
158+
{
159+
"kind": "method",
160+
"name": "triggerValidation",
161+
"return": {
162+
"type": {
163+
"text": "void"
164+
}
165+
}
166+
},
158167
{
159168
"kind": "field",
160169
"name": "input",

src/auto-check-element.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export class AutoCheckElement extends HTMLElement {
109109

110110
input.addEventListener('blur', changeHandler)
111111
input.addEventListener('input', changeHandler)
112+
input.addEventListener('triggerValidation', changeHandler)
112113
input.autocomplete = 'off'
113114
input.spellcheck = false
114115
}
@@ -134,6 +135,13 @@ export class AutoCheckElement extends HTMLElement {
134135
}
135136
}
136137

138+
triggerValidation(): void {
139+
const input = this.input
140+
if (!input) return
141+
142+
input.dispatchEvent(new Event('triggerValidation'))
143+
}
144+
137145
static get observedAttributes(): string[] {
138146
return ['required']
139147
}
@@ -226,7 +234,8 @@ function handleChange(checker: () => void, event: Event) {
226234
autoCheckElement.onlyValidateOnBlur &&
227235
!autoCheckElement.validateOnKeystroke &&
228236
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)
237+
(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)
238+
event.type === 'triggerValidation' // Trigger validation manually
230239
) {
231240
setLoadingState(event)
232241
checker()

test/auto-check.js

+42
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,48 @@ describe('auto-check element', function () {
202202
})
203203
})
204204

205+
describe('manually triggering validation', function () {
206+
let checker
207+
let input
208+
209+
beforeEach(function () {
210+
const container = document.createElement('div')
211+
container.innerHTML = `
212+
<auto-check csrf="foo" src="/success" required>
213+
<input id="input-field" value="hub">
214+
</auto-check>`
215+
document.body.append(container)
216+
217+
checker = document.querySelector('auto-check')
218+
input = checker.querySelector('input')
219+
})
220+
221+
it('emits on manual trigger', async function () {
222+
const events = []
223+
input.addEventListener('auto-check-start', event => events.push(event.type))
224+
225+
document.getElementById('input-field').closest('auto-check').triggerValidation()
226+
227+
assert.deepEqual(events, ['auto-check-start'])
228+
})
229+
230+
it('does not emit on manual trigger if input is empty', async function () {
231+
const events = []
232+
input.addEventListener('auto-check-start', event => events.push(event.type))
233+
234+
input.value = ''
235+
document.getElementById('input-field').closest('auto-check').triggerValidation()
236+
237+
assert.deepEqual(events, [])
238+
})
239+
240+
afterEach(function () {
241+
document.body.innerHTML = ''
242+
checker = null
243+
input = null
244+
})
245+
})
246+
205247
describe('using HTTP GET', function () {
206248
let checker
207249
let input

0 commit comments

Comments
 (0)