-
Notifications
You must be signed in to change notification settings - Fork 49.1k
Closed
Labels
Description
There is an asymmetry to EnterLeave event plugin. Since mouseenter
is created from the relativeTarget of the mouseout
event it fires even though the target is disabled. Since the mouseleave
is the inverse, i.e requires that the disabled element fire a mouseout, it doesn't fire a mouseleave
for the disabled element.
I am pretty sure the correct behavior here is that neither event should fire if its target is disabled, since this mirrors mouseout
. No idea if none-chrome browsers have the same behavior for which mouse events fire on disabled elements.
Additional caveat I just realized, React is probably also not firing mousenter
events in the case where the mouse leaves a disabled element into a non disabled element
nhardy, jens-duttke, jcestibariz, mohsinulhaq, ItsTarik and 21 more
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
jquense commentedon Jun 29, 2015
So here is an initial attempt at a fix but I can't figure out how to properly use
EventPropagators
here. Is there a way I am missing to listen for child events (i.e mouseout/over) but also return an event that doesn't bubble itself?the below only listens for mouseout/over on the element that has the callback attached :/
jimfb commentedon Jul 6, 2015
@syranide @sebmarkbage
rogchap commentedon Aug 18, 2015
An example of when you would want
mouseleave
to fire on a disabled element is if you disabled the buttononclick
.Think of a payment button:
mouseenter
is called changing the hover state{hover:true}
thenonclick
sets state to disabled{disabled:true}
, meanwhile, user moves mouse away from button and the button state is changed back to enabled{disabled:false}
. The button now is in a state that is incorrect as it currently has the state{hover:true}
.jquense commentedon Dec 17, 2015
Ping @jimfb @sebmarkbage @syranide
Got bit by this again, I'd be happy to PR something, but the current mouseleave/enter code seems really deeply integrated (has its own event propagator?). My current stumbling block is just the below:
The problem is that I need to emit an event that does not fire when the dependent DOM events (out/leave) fire. tests seem using other examples seem either to emit for every child event, or not respond to bubbled child events at all.
jimfb commentedon Dec 17, 2015
adding @spicyj.
@syranide and @spicyj: either of you know of a good example where we normalize in this way? Can either of you provide some tips here?
sophiebits commentedon Dec 18, 2015
No, I'm not sure. I would be inclined to think that both mouseenter and mouseleave should fire. It's a little weird to me that click doesn't but I can kind of justify that one in my mind.
jquense commentedon Dec 18, 2015
@spicyj I tend to agree with you, the problem though is that both mouseout and mouseover do not fire on disabled elements. I am not sure why...all spec stuff I've seen suggests that just click events shouldn't, but browsers seem to go with "all mouse events". In that context it might more consistent to also not allow mouse enter/leave as well. But to be honest its all a moot discussion unless there is an implementation that doesn't rely on either mouseout or mouseover, which may be possible but not common it seems.
andykog commentedon Dec 29, 2015
There is also a problem for elements, containing disabled element.
onMouseEnter
works,onMouseLeave
doesn't.Native
mouseleave
event works as expected in the same situation.chicoxyzzy commentedon Mar 7, 2016
A have same issue. I expect to get
onMouseLeave
event on disabled button but in doesn't workchicoxyzzy commentedon Mar 7, 2016
More on this: it works proper in Firefox but doesn't work in Chrome and Safari
attilaaronnagy commentedon May 23, 2016
After react 15, onClick on disabled elements does not fire. That makes me a ton of trouble. Should I open an other issue?
64 remaining items
jquense commentedon Jul 20, 2020
This is still broken: #19419 opened a new issue for it
fix(tooltip): pointer-events disabled on button toggles
fix(tooltip): pointer-events disabled on button toggles
fix(tooltip): pointer-events disabled on button toggles (#816)
onMouseOut
prop handler like @mui/material/Button mui/material-ui#38101