@@ -31,6 +31,8 @@ export class Toggletip extends PopoverContainer implements AfterViewInit {
3131
3232 @ContentChild ( ToggletipButton , { read : ElementRef } ) btn ! : ElementRef ;
3333
34+ documentClick = this . handleFocusOut . bind ( this ) ;
35+
3436 constructor ( private hostElement : ElementRef , private renderer : Renderer2 ) {
3537 super ( ) ;
3638 this . highContrast = true ;
@@ -40,7 +42,22 @@ export class Toggletip extends PopoverContainer implements AfterViewInit {
4042 ngAfterViewInit ( ) : void {
4143 // Listen for click events on trigger
4244 fromEvent ( this . btn . nativeElement , "click" )
43- . subscribe ( ( event : Event ) => this . handleExpansion ( ! this . isOpen , event ) ) ;
45+ . subscribe ( ( event : Event ) => {
46+ // Add/Remove event listener based on isOpen to improve performance when there
47+ // are a lot of toggletips
48+ if ( this . isOpen ) {
49+ document . removeEventListener ( "click" , this . documentClick ) ;
50+ } else {
51+ document . addEventListener ( "click" , this . documentClick ) ;
52+ }
53+
54+ this . handleExpansion ( ! this . isOpen , event ) ;
55+ } ) ;
56+
57+ // Toggletip is open on initial render, add 'click' event listener to document so users can close
58+ if ( this . isOpen ) {
59+ document . addEventListener ( "click" , this . documentClick ) ;
60+ }
4461
4562 if ( this . btn ) {
4663 this . renderer . setAttribute ( this . btn . nativeElement , "aria-controls" , this . id ) ;
@@ -55,7 +72,6 @@ export class Toggletip extends PopoverContainer implements AfterViewInit {
5572 }
5673 }
5774
58- @HostListener ( "document:click" , [ "$event" ] )
5975 handleFocusOut ( event ) {
6076 if ( ! this . hostElement . nativeElement . contains ( event . target ) ) {
6177 this . handleExpansion ( false , event ) ;
0 commit comments