我想通过验证字段集中的所有元素来部分验证表单。
作为验证的触发,我正在听focusout
事件,这些事件冒泡到每个字段集。
如果该字段集中的表单元素没有:focus
,我想执行验证。
我试图这样做:
const fieldsets = [...document.querySelectorAll('fieldset')]
for (const fieldset of fieldsets) {
fieldset.addEventListener('focusout', (e) => {
let focussedElements = e.currentTarget.querySelectorAll(':focus');
if (focussedElements.length === 0) {
console.log(`no element inside fieldset #${e.currentTarget.id} has focus`)
} else if (focussedElements.length > 0) {
console.log(`element ${focussedElements[0]} inside fieldset #${e.currentTarget.id} has focus`)
}
})
}
<fieldset id="fs1">
<legend>Fieldset 1</legend>
<input type="text">
<input type="text">
</fieldset>
<fieldset id="fs2">
<legend>Fieldset 2</legend>
<input type="text">
<select>
<option>1</option>
<option>2</option>
</select>
</fieldset>
但是e.currentTarget.querySelectorAll(':focus')
始终具有length
中的0
。
如何可靠地检查fieldset
是否具有包含:focus
的子元素?
注意:我不想使用jQuery或其他任何库来完成任务。
答案 0 :(得分:1)
您不是只需要等待对新元素的关注吗?像这样:
const fieldsets = [...document.querySelectorAll('fieldset')]
for (const fieldset of fieldsets) {
fieldset.addEventListener('focusout', (e) => {
let ct = e.currentTarget;
setTimeout(() => {
let focussedElements = ct.querySelectorAll(':focus');
if (focussedElements.length === 0) {
console.log(`no element inside fieldset #${ct.id} has focus`)
} else if (focussedElements.length > 0) {
console.log(`element ${focussedElements[0]} inside fieldset #${ct.id} has focus`)
}
}, 10)
})
}
<fieldset id="fs1">
<legend>Fieldset 1</legend>
<input type="text">
<input type="text">
</fieldset>
<fieldset id="fs2">
<legend>Fieldset 2</legend>
<input type="text">
<select>
<option>1</option>
<option>2</option>
</select>
</fieldset>