@@ -61,12 +61,29 @@ class ReactTooltip extends Component {
6161 currentTarget : null // Current target of mouse event
6262 }
6363
64+ this . bind ( [
65+ 'showTooltip' ,
66+ 'updateTooltip' ,
67+ 'hideTooltip' ,
68+ 'globalRebuild' ,
69+ 'onWindowResize'
70+ ] )
71+
6472 this . mount = true
6573 this . delayShowLoop = null
6674 this . delayHideLoop = null
6775 this . intervalUpdateContent = null
6876 }
6977
78+ /**
79+ * For unify the bind and unbind listener
80+ */
81+ bind ( methodArray ) {
82+ methodArray . forEach ( method => {
83+ this [ method ] = this [ method ] . bind ( this )
84+ } )
85+ }
86+
7087 componentDidMount ( ) {
7188 this . setStyleHeader ( ) // Set the style to the <link>
7289 this . bindListener ( ) // Bind listener for tooltip
@@ -115,27 +132,24 @@ class ReactTooltip extends Component {
115132 if ( target . getAttribute ( 'currentItem' ) === null ) {
116133 target . setAttribute ( 'currentItem' , 'false' )
117134 }
135+ this . unbindBasicListener ( target )
118136
119137 if ( this . isCustomEvent ( target ) ) {
120138 this . customBindListener ( target )
121139 return
122140 }
123141
124- target . removeEventListener ( 'mouseenter' , this . showTooltip )
125- target . addEventListener ( 'mouseenter' , ::this . showTooltip , isCaptureMode )
142+ target . addEventListener ( 'mouseenter' , this . showTooltip , isCaptureMode )
126143 if ( this . state . effect === 'float' ) {
127- target . removeEventListener ( 'mousemove' , this . updateTooltip )
128- target . addEventListener ( 'mousemove' , ::this . updateTooltip , isCaptureMode )
144+ target . addEventListener ( 'mousemove' , this . updateTooltip , isCaptureMode )
129145 }
130-
131- target . removeEventListener ( 'mouseleave' , this . hideTooltip )
132- target . addEventListener ( 'mouseleave' , ::this . hideTooltip , isCaptureMode )
146+ target . addEventListener ( 'mouseleave' , this . hideTooltip , isCaptureMode )
133147 } )
134148
135149 // Global event to hide tooltip
136150 if ( globalEventOff ) {
137151 window . removeEventListener ( globalEventOff , this . hideTooltip )
138- window . addEventListener ( globalEventOff , :: this . hideTooltip , false )
152+ window . addEventListener ( globalEventOff , this . hideTooltip , false )
139153 }
140154 }
141155
@@ -145,21 +159,25 @@ class ReactTooltip extends Component {
145159 unbindListener ( ) {
146160 const { id, globalEventOff} = this . props
147161 const targetArray = this . getTargetArray ( id )
148-
149162 targetArray . forEach ( target => {
150- if ( this . isCustomEvent ( target ) ) {
151- this . customUnbindListener ( target )
152- return
153- }
154-
155- target . removeEventListener ( 'mouseenter' , this . showTooltip )
156- target . removeEventListener ( 'mousemove' , this . updateTooltip )
157- target . removeEventListener ( 'mouseleave' , this . hideTooltip )
163+ this . unbindBasicListener ( target )
164+ if ( this . isCustomEvent ( target ) ) this . customUnbindListener ( target )
158165 } )
159166
160167 if ( globalEventOff ) window . removeEventListener ( globalEventOff , this . hideTooltip )
161168 }
162169
170+ /**
171+ * Invoke this before bind listener and ummount the compont
172+ * it is necessary to invloke this even when binding custom event
173+ * so that the tooltip can switch between custom and default listener
174+ */
175+ unbindBasicListener ( target ) {
176+ target . removeEventListener ( 'mouseenter' , this . showTooltip )
177+ target . removeEventListener ( 'mousemove' , this . updateTooltip )
178+ target . removeEventListener ( 'mouseleave' , this . hideTooltip )
179+ }
180+
163181 /**
164182 * When mouse enter, show the tooltip
165183 */
@@ -170,6 +188,7 @@ class ReactTooltip extends Component {
170188 const originTooltip = e . currentTarget . getAttribute ( 'data-tip' )
171189 const isMultiline = e . currentTarget . getAttribute ( 'data-multiline' ) || multiline || false
172190
191+ // Generate tootlip content
173192 let content = children
174193 if ( getContent ) {
175194 if ( Array . isArray ( getContent ) ) {
@@ -178,14 +197,16 @@ class ReactTooltip extends Component {
178197 content = getContent ( )
179198 }
180199 }
181-
182200 const placeholder = getTipContent ( originTooltip , content , isMultiline )
183201
202+ // If e is instance of FocusEvent, switch to `solid` effect
203+ const isFocus = e instanceof FocusEvent
204+
184205 this . setState ( {
185206 placeholder,
186207 place : e . currentTarget . getAttribute ( 'data-place' ) || this . props . place || 'top' ,
187208 type : e . currentTarget . getAttribute ( 'data-type' ) || this . props . type || 'dark' ,
188- effect : e . currentTarget . getAttribute ( 'data-effect' ) || this . props . effect || 'float' ,
209+ effect : isFocus && 'solid' || e . currentTarget . getAttribute ( 'data-effect' ) || this . props . effect || 'float' ,
189210 offset : e . currentTarget . getAttribute ( 'data-offset' ) || this . props . offset || { } ,
190211 html : e . currentTarget . getAttribute ( 'data-html' ) === 'true' || this . props . html || false ,
191212 delayShow : e . currentTarget . getAttribute ( 'data-delay-show' ) || this . props . delayShow || 0 ,
@@ -255,7 +276,7 @@ class ReactTooltip extends Component {
255276 */
256277 addScrollListener ( e ) {
257278 const isCaptureMode = this . isCapture ( e . currentTarget )
258- window . addEventListener ( 'scroll' , :: this . hideTooltip , isCaptureMode )
279+ window . addEventListener ( 'scroll' , this . hideTooltip , isCaptureMode )
259280 }
260281
261282 removeScrollListener ( ) {
0 commit comments