Búsqueda de sitios web

javascript - document.ActiveElement siempre devuelve body en Angular


Entonces, lo que estaba pasando es como dice el título. En (focusout) cuando llamaba a un método que verifica si un elemento es un document.activeElement (enfocado), siempre obtendría como resultado el body. Solo si hacía clic en otra ventana/herramientas de inspección obtenía un resultado correcto al hacer un console.log, que en mi caso era un elemento de botón.

Tenga en cuenta que esto está en Angular.

La solución está abajo.

component.html:

<button 
  (focusout)="_onFocusOut()" 
  class="typography-button" (keydown)="_onItemKeyDown($event)" 
  (click)="_selectItem(item)" #menuitem>
  {{ item.label }}
</button>

componente.ts

_onFocusOut(): void{
  const isActiveElement = this.menuItemElements?.toArray().some(item => {
  // document.activeElement is always body
    return item.nativeElement == document.activeElement;
  });

  if(!isActiveElement){
    // do something
  }

}

Respuesta #1

La solución fue simplemente envolver toda la lógica del método en un método settimeout:

_onFocusOut(): void{
// add setTimeout with no value as a second parameter
    setTimeout(() => {
      const isActiveElement = this.menuItemElements?.toArray().some(item => {
        return item.nativeElement == document.activeElement;
      });

      if(!isActiveElement){
        this._toggled = false;
      }
    });
  }