@@ -65,6 +65,11 @@ export default {
6565 el . tooltipOptions = getOptions ( el , binding )
6666 el . onClickOutsideCallback = null
6767
68+ if ( el . _tooltipEventsAdded ) {
69+ return
70+ }
71+ el . _tooltipEventsAdded = true
72+
6873 el . updatePositionEvent = ( event ) => {
6974 const rect = el . getBoundingClientRect ( )
7075 const position = el . getAttribute ( 'tooltip-position' ) || 'bottom'
@@ -162,6 +167,11 @@ export default {
162167 if ( el . tooltipOptions . contentIsHtml ) {
163168 el . tooltipContentElement . innerHTML = el . tooltipOptions . value
164169 } else {
170+ while ( el . tooltipContentElement . firstChild ) {
171+ el . tooltipContentElement . removeChild (
172+ el . tooltipContentElement . firstChild
173+ )
174+ }
165175 el . tooltipContentElement . appendChild (
166176 document . createTextNode ( el . tooltipOptions . value )
167177 )
@@ -179,17 +189,20 @@ export default {
179189 el . removeTimeout ( )
180190
181191 // make tooltip content preserved if pointer hovers
182- el . tooltipContentElement . addEventListener ( 'mouseenter' , el . removeTimeout )
183- el . tooltipContentElement . addEventListener (
184- 'mouseleave' ,
185- el . tooltipMoveLeaveEvent
186- )
192+ // Only add event listeners if they haven't been added yet
193+ if ( ! el . _tooltipContentEventsAdded ) {
194+ el . _tooltipContentEventsAdded = true
195+ el . tooltipContentElement . addEventListener (
196+ 'mouseenter' ,
197+ el . removeTimeout
198+ )
199+ el . tooltipContentElement . addEventListener (
200+ 'mouseleave' ,
201+ el . tooltipMoveLeaveEvent
202+ )
203+ }
187204
188205 window . addEventListener ( 'mousemove' , el . tooltipMouseMoveEvent )
189-
190- // When the user scrolls or resizes the window it could be possible that the
191- // element where the tooltip is anchored to has moved, so then the position
192- // needs to be updated. We only want to do this when the tooltip is visible.
193206 window . addEventListener ( 'scroll' , el . updatePositionEvent , true )
194207 window . addEventListener ( 'resize' , el . updatePositionEvent )
195208
@@ -211,12 +224,9 @@ export default {
211224 * visible, if duration is > 0.
212225 */
213226 el . tooltipMoveLeaveEvent = ( ) => {
214- // we should remove any pending timeout before setting new one, because timeout
215- // should be counted from the last mouse leave event.
216227 el . removeTimeout ( )
217228 el . tooltipTimeout = setTimeout (
218229 el . tooltipClose ,
219- // timeout from caller is in seconds. remember to convert to mseconds
220230 el . tooltipOptions . duration * 1000
221231 )
222232 }
@@ -230,21 +240,23 @@ export default {
230240 * actually closing the tooltip here
231241 */
232242 el . tooltipClose = ( ) => {
233- // cleanup actions: remove window handlers set with onClickOutside()
234243 el . removeTooltipOutsideClickCallback ( )
235244
236245 if ( el . tooltipElement ) {
237- el . tooltipElement . parentNode . removeChild ( el . tooltipElement )
246+ if ( el . tooltipElement . parentNode ) {
247+ el . tooltipElement . parentNode . removeChild ( el . tooltipElement )
248+ }
238249 el . tooltipElement = null
239250 el . tooltipContentElement = null
251+ el . _tooltipContentEventsAdded = false
240252 }
241253
242254 window . removeEventListener ( 'mousemove' , el . tooltipMouseMoveEvent )
243255 window . removeEventListener ( 'scroll' , el . updatePositionEvent , true )
244256 window . removeEventListener ( 'resize' , el . updatePositionEvent )
245257 el . removeTimeout ( )
246258 }
247- // those event listeners should be bind all the time to the el element
259+
248260 el . addEventListener ( 'mouseenter' , el . tooltipMouseEnterEvent )
249261 el . addEventListener ( 'mouseleave' , el . tooltipMoveLeaveEvent )
250262 } ,
@@ -257,10 +269,17 @@ export default {
257269 if ( el . tooltipElement && el . tooltipElement . parentNode ) {
258270 el . tooltipElement . parentNode . removeChild ( el . tooltipElement )
259271 }
272+
273+ if ( el . _tooltipEventsAdded ) {
274+ el . removeEventListener ( 'mouseenter' , el . tooltipMouseEnterEvent )
275+ el . removeEventListener ( 'mouseleave' , el . tooltipMoveLeaveEvent )
276+ el . _tooltipEventsAdded = false
277+ }
278+
260279 el . tooltipElement = null
261280 el . tooltipContentElement = null
262- el . removeEventListener ( 'mouseenter' , el . tooltipMouseEnterEvent )
263- el . removeEventListener ( 'mouseleave' , el . tooltipMoveLeaveEvent )
281+ el . _tooltipContentEventsAdded = false
282+
264283 window . removeEventListener ( 'scroll' , el . updatePositionEvent , true )
265284 window . removeEventListener ( 'resize' , el . updatePositionEvent )
266285 } ,
0 commit comments