@@ -8,6 +8,7 @@ import classname from 'classnames'
88import staticMethods from './decorators/staticMethods'
99import windowListener from './decorators/windowListener'
1010import customEvent from './decorators/customEvent'
11+ import isCapture from './decorators/isCapture'
1112
1213/* Utils */
1314import getPosition from './utils/getPosition'
@@ -16,8 +17,7 @@ import getTipContent from './utils/getTipContent'
1617/* CSS */
1718import cssStyle from './style'
1819
19- /* TODO: attribute to enable global click to hide the tooltip */
20- @staticMethods @windowListener @customEvent
20+ @staticMethods @windowListener @customEvent @isCapture
2121class ReactTooltip extends Component {
2222
2323 static propTypes = {
@@ -33,10 +33,11 @@ class ReactTooltip extends Component {
3333 html : PropTypes . bool ,
3434 delayHide : PropTypes . number ,
3535 delayShow : PropTypes . number ,
36- event : PropTypes . any ,
37- eventOff : PropTypes . any ,
36+ event : PropTypes . string ,
37+ eventOff : PropTypes . string ,
3838 watchWindow : PropTypes . bool ,
39- isCapture : PropTypes . bool
39+ isCapture : PropTypes . bool ,
40+ globalEventOff : PropTypes . string
4041 }
4142
4243 constructor ( props ) {
@@ -55,7 +56,6 @@ class ReactTooltip extends Component {
5556 delayShow : 0 ,
5657 event : props . event || null ,
5758 eventOff : props . eventOff || null ,
58- isCapture : props . isCapture || false ,
5959 currentEvent : null , // Current mouse event
6060 currentTarget : null // Current target of mouse event
6161 }
@@ -106,10 +106,11 @@ class ReactTooltip extends Component {
106106 * These listeners used to trigger showing or hiding the tooltip
107107 */
108108 bindListener ( ) {
109- const { id} = this . props
109+ const { id, globalEventOff } = this . props
110110 let targetArray = this . getTargetArray ( id )
111111
112112 targetArray . forEach ( target => {
113+ const isCaptureMode = this . isCapture ( target )
113114 if ( target . getAttribute ( 'currentItem' ) === null ) {
114115 target . setAttribute ( 'currentItem' , 'false' )
115116 }
@@ -120,22 +121,28 @@ class ReactTooltip extends Component {
120121 }
121122
122123 target . removeEventListener ( 'mouseenter' , this . showTooltip )
123- target . addEventListener ( 'mouseenter' , ::this . showTooltip , false )
124+ target . addEventListener ( 'mouseenter' , ::this . showTooltip , isCaptureMode )
124125 if ( this . state . effect === 'float' ) {
125126 target . removeEventListener ( 'mousemove' , this . updateTooltip )
126- target . addEventListener ( 'mousemove' , ::this . updateTooltip , false )
127+ target . addEventListener ( 'mousemove' , ::this . updateTooltip , isCaptureMode )
127128 }
128129
129130 target . removeEventListener ( 'mouseleave' , this . hideTooltip )
130- target . addEventListener ( 'mouseleave' , ::this . hideTooltip , false )
131+ target . addEventListener ( 'mouseleave' , ::this . hideTooltip , isCaptureMode )
131132 } )
133+
134+ // Global event to hide tooltip
135+ if ( globalEventOff ) {
136+ window . removeEventListener ( globalEventOff , this . hideTooltip )
137+ window . addEventListener ( globalEventOff , ::this . hideTooltip , false )
138+ }
132139 }
133140
134141 /**
135142 * Unbind listeners on target elements
136143 */
137144 unbindListener ( ) {
138- const { id} = this . props
145+ const { id, globalEventOff } = this . props
139146 const targetArray = this . getTargetArray ( id )
140147
141148 targetArray . forEach ( target => {
@@ -148,6 +155,8 @@ class ReactTooltip extends Component {
148155 target . removeEventListener ( 'mousemove' , this . updateTooltip )
149156 target . removeEventListener ( 'mouseleave' , this . hideTooltip )
150157 } )
158+
159+ if ( globalEventOff ) window . removeEventListener ( globalEventOff , this . hideTooltip )
151160 }
152161
153162 /**
@@ -173,7 +182,7 @@ class ReactTooltip extends Component {
173182 border : e . currentTarget . getAttribute ( 'data-border' ) === 'true' || this . props . border || false ,
174183 extraClass : e . currentTarget . getAttribute ( 'data-class' ) || this . props . class || ''
175184 } , ( ) => {
176- this . addScrollListener ( )
185+ this . addScrollListener ( e )
177186 this . updateTooltip ( e )
178187 } )
179188 }
@@ -224,8 +233,9 @@ class ReactTooltip extends Component {
224233 * Add scroll eventlistener when tooltip show
225234 * automatically hide the tooltip when scrolling
226235 */
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 )
229239 }
230240
231241 removeScrollListener ( ) {
0 commit comments