@@ -31,6 +31,8 @@ export class Toggletip extends PopoverContainer implements AfterViewInit {
31
31
32
32
@ContentChild ( ToggletipButton , { read : ElementRef } ) btn ! : ElementRef ;
33
33
34
+ documentClick = this . handleFocusOut . bind ( this ) ;
35
+
34
36
constructor ( private hostElement : ElementRef , private renderer : Renderer2 ) {
35
37
super ( ) ;
36
38
this . highContrast = true ;
@@ -40,7 +42,22 @@ export class Toggletip extends PopoverContainer implements AfterViewInit {
40
42
ngAfterViewInit ( ) : void {
41
43
// Listen for click events on trigger
42
44
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
+ }
44
61
45
62
if ( this . btn ) {
46
63
this . renderer . setAttribute ( this . btn . nativeElement , "aria-controls" , this . id ) ;
@@ -55,7 +72,6 @@ export class Toggletip extends PopoverContainer implements AfterViewInit {
55
72
}
56
73
}
57
74
58
- @HostListener ( "document:click" , [ "$event" ] )
59
75
handleFocusOut ( event ) {
60
76
if ( ! this . hostElement . nativeElement . contains ( event . target ) ) {
61
77
this . handleExpansion ( false , event ) ;
0 commit comments