代码之家  ›  专栏  ›  技术社区  ›  connexo

如何检查字段集中的表单元素是否有焦点

  •  3
  • connexo  · 技术社区  · 6 年前

    作为验证的导火索,我在听 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 :焦点

    注意:我不想将jQuery或任何其他库用于此任务。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alohci    6 年前

    难道你不需要等待对新元素的关注发生吗?这样地:

    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>
    推荐文章