@@ -75,39 +75,46 @@ function setupDropdowns() {
7575 } ) ;
7676}
7777
78- window . tooltipSetup = ( ) => {
79- const tooltipElements = document . querySelectorAll ( '[title]' ) ;
78+ function tooltipSetup ( ) {
79+ // initialize global tooltip element or get reference
80+ let customTooltip = document . getElementById ( "customTooltip" ) ;
81+ if ( ! customTooltip ) {
82+ customTooltip = document . createElement ( "div" ) ;
83+ customTooltip . id = "customTooltip" ;
84+ customTooltip . className = "btn-tooltip" ;
85+ document . body . appendChild ( customTooltip ) ;
86+ }
8087
81- tooltipElements . forEach ( ( element ) => {
82- const tooltipText = element . getAttribute ( 'title' ) ;
83- element . removeAttribute ( 'title' ) ;
84- element . setAttribute ( 'data-title' , tooltipText ) ;
85- const customTooltip = document . createElement ( 'div' ) ;
86- customTooltip . className = 'btn-tooltip' ;
87- customTooltip . textContent = tooltipText ;
88+ function updateTooltipPosition ( event , text ) {
89+ if ( window . innerWidth >= 1200 ) {
90+ customTooltip . textContent = text ;
91+ customTooltip . style . display = "block" ;
92+ customTooltip . style . left = `${ event . pageX + 10 } px` ;
93+ customTooltip . style . top = `${ event . pageY + 10 } px` ;
94+ }
95+ }
8896
89- document . body . appendChild ( customTooltip ) ;
97+ function hideTooltip ( ) {
98+ customTooltip . style . display = "none" ;
99+ }
90100
91- element . addEventListener ( 'mouseenter' , ( event ) => {
92- if ( window . innerWidth >= 1200 ) {
93- customTooltip . style . display = 'block' ;
94- customTooltip . style . left = `${ event . pageX + 10 } px` ;
95- customTooltip . style . top = `${ event . pageY + 10 } px` ;
96- }
97- } ) ;
101+ // find uninitialized tooltips and set up event listeners
102+ const tooltipElements = document . querySelectorAll ( "[title]" ) ;
98103
99- element . addEventListener ( 'mousemove' , ( event ) => {
100- if ( window . innerWidth >= 1200 ) {
101- customTooltip . style . left = `${ event . pageX + 10 } px` ;
102- customTooltip . style . top = `${ event . pageY + 10 } px` ;
103- }
104- } ) ;
104+ tooltipElements . forEach ( ( element ) => {
105+ const tooltipText = element . getAttribute ( "title" ) ;
106+ element . removeAttribute ( "title" ) ;
107+ element . setAttribute ( "data-title" , tooltipText ) ; // no UI effect, just for reference
105108
106- element . addEventListener ( 'mouseleave' , ( ) => {
107- customTooltip . style . display = 'none' ;
108- } ) ;
109+ element . addEventListener ( "mouseenter" , ( event ) => updateTooltipPosition ( event , tooltipText ) ) ;
110+ element . addEventListener ( "mousemove" , ( event ) => updateTooltipPosition ( event , tooltipText ) ) ;
111+ element . addEventListener ( "mouseleave" , hideTooltip ) ;
112+
113+ // in case UI moves and mouseleave is not triggered, tooltip is readded when mouse is moved over the element
114+ element . addEventListener ( "click" , hideTooltip ) ;
109115 } ) ;
110116} ;
117+ window . tooltipSetup = tooltipSetup ;
111118
112119// Override the bootstrap dropdown styles for mobile
113120function fixNavbarDropdownStyles ( ) {
0 commit comments