@@ -8,6 +8,7 @@ import classname from 'classnames'
8
8
import staticMethods from './decorators/staticMethods'
9
9
import windowListener from './decorators/windowListener'
10
10
import customEvent from './decorators/customEvent'
11
+ import isCapture from './decorators/isCapture'
11
12
12
13
/* Utils */
13
14
import getPosition from './utils/getPosition'
@@ -16,8 +17,7 @@ import getTipContent from './utils/getTipContent'
16
17
/* CSS */
17
18
import cssStyle from './style'
18
19
19
- /* TODO: attribute to enable global click to hide the tooltip */
20
- @staticMethods @windowListener @customEvent
20
+ @staticMethods @windowListener @customEvent @isCapture
21
21
class ReactTooltip extends Component {
22
22
23
23
static propTypes = {
@@ -33,10 +33,11 @@ class ReactTooltip extends Component {
33
33
html : PropTypes . bool ,
34
34
delayHide : PropTypes . number ,
35
35
delayShow : PropTypes . number ,
36
- event : PropTypes . any ,
37
- eventOff : PropTypes . any ,
36
+ event : PropTypes . string ,
37
+ eventOff : PropTypes . string ,
38
38
watchWindow : PropTypes . bool ,
39
- isCapture : PropTypes . bool
39
+ isCapture : PropTypes . bool ,
40
+ globalEventOff : PropTypes . string
40
41
}
41
42
42
43
constructor ( props ) {
@@ -55,7 +56,6 @@ class ReactTooltip extends Component {
55
56
delayShow : 0 ,
56
57
event : props . event || null ,
57
58
eventOff : props . eventOff || null ,
58
- isCapture : props . isCapture || false ,
59
59
currentEvent : null , // Current mouse event
60
60
currentTarget : null // Current target of mouse event
61
61
}
@@ -106,10 +106,11 @@ class ReactTooltip extends Component {
106
106
* These listeners used to trigger showing or hiding the tooltip
107
107
*/
108
108
bindListener ( ) {
109
- const { id} = this . props
109
+ const { id, globalEventOff } = this . props
110
110
let targetArray = this . getTargetArray ( id )
111
111
112
112
targetArray . forEach ( target => {
113
+ const isCaptureMode = this . isCapture ( target )
113
114
if ( target . getAttribute ( 'currentItem' ) === null ) {
114
115
target . setAttribute ( 'currentItem' , 'false' )
115
116
}
@@ -120,22 +121,28 @@ class ReactTooltip extends Component {
120
121
}
121
122
122
123
target . removeEventListener ( 'mouseenter' , this . showTooltip )
123
- target . addEventListener ( 'mouseenter' , ::this . showTooltip , false )
124
+ target . addEventListener ( 'mouseenter' , ::this . showTooltip , isCaptureMode )
124
125
if ( this . state . effect === 'float' ) {
125
126
target . removeEventListener ( 'mousemove' , this . updateTooltip )
126
- target . addEventListener ( 'mousemove' , ::this . updateTooltip , false )
127
+ target . addEventListener ( 'mousemove' , ::this . updateTooltip , isCaptureMode )
127
128
}
128
129
129
130
target . removeEventListener ( 'mouseleave' , this . hideTooltip )
130
- target . addEventListener ( 'mouseleave' , ::this . hideTooltip , false )
131
+ target . addEventListener ( 'mouseleave' , ::this . hideTooltip , isCaptureMode )
131
132
} )
133
+
134
+ // Global event to hide tooltip
135
+ if ( globalEventOff ) {
136
+ window . removeEventListener ( globalEventOff , this . hideTooltip )
137
+ window . addEventListener ( globalEventOff , ::this . hideTooltip , false )
138
+ }
132
139
}
133
140
134
141
/**
135
142
* Unbind listeners on target elements
136
143
*/
137
144
unbindListener ( ) {
138
- const { id} = this . props
145
+ const { id, globalEventOff } = this . props
139
146
const targetArray = this . getTargetArray ( id )
140
147
141
148
targetArray . forEach ( target => {
@@ -148,6 +155,8 @@ class ReactTooltip extends Component {
148
155
target . removeEventListener ( 'mousemove' , this . updateTooltip )
149
156
target . removeEventListener ( 'mouseleave' , this . hideTooltip )
150
157
} )
158
+
159
+ if ( globalEventOff ) window . removeEventListener ( globalEventOff , this . hideTooltip )
151
160
}
152
161
153
162
/**
@@ -173,7 +182,7 @@ class ReactTooltip extends Component {
173
182
border : e . currentTarget . getAttribute ( 'data-border' ) === 'true' || this . props . border || false ,
174
183
extraClass : e . currentTarget . getAttribute ( 'data-class' ) || this . props . class || ''
175
184
} , ( ) => {
176
- this . addScrollListener ( )
185
+ this . addScrollListener ( e )
177
186
this . updateTooltip ( e )
178
187
} )
179
188
}
@@ -224,8 +233,9 @@ class ReactTooltip extends Component {
224
233
* Add scroll eventlistener when tooltip show
225
234
* automatically hide the tooltip when scrolling
226
235
*/
227
- addScrollListener ( ) {
228
- window . addEventListener ( 'scroll' , ::this . hideTooltip )
236
+ addScrollListener ( e ) {
237
+ const isCaptureMode = this . isCapture ( e . currentTarget )
238
+ window . addEventListener ( 'scroll' , ::this . hideTooltip , isCaptureMode )
229
239
}
230
240
231
241
removeScrollListener ( ) {
0 commit comments