Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MenuItem] Не всегда срабатывает onMouseLeave в состоянии disabled #1783

Closed
wKich opened this issue Dec 3, 2019 · 9 comments
Labels

Comments

@wKich
Copy link
Member

wKich commented Dec 3, 2019

Screen Recording 2019-12-03 at 10 07 53

export function SuiteLink({ title, suite }: SuiteLinkProps): JSX.Element {
  const [hover, setHover] = useState(false);

  const handleMouseEnter = (): void => setHover(true);
  const handleMouseLeave = (): void => setHover(false);

  return (
    <MenuItem
      state={hover ? 'selected' : null}
      onMouseEnter={handleMouseEnter}
      onMouseLeave={handleMouseLeave}
      disabled={/* condition */}
    >
    {/* content */}
    </MenuItem>
  );
}
@wKich wKich added the bug label Dec 3, 2019
@zhzz
Copy link
Member

zhzz commented Dec 3, 2019

Возможно связано c #1422

@dzekh
Copy link

dzekh commented Dec 3, 2019

а в состоянии disabled пункт меню должен вообще подсвечиваться

@wKich
Copy link
Member Author

wKich commented Dec 3, 2019

@dzekh дело же не в подсвечивании, а в том что обработчик не вызвался

@JackUait
Copy link
Contributor

Вообще странно, что он когда-то срабатывал. На DOM элементах, которые могут находиться в состоянии disabled (button, input, select, textarea, optgroup, option и fieldset) не должны вызываться никакие события, в том числе onMouseEnter и onMouseLeave.

Сейчас, если в MenuItem передаётся проп disabled, то MenuItem принудительно превращается в кнопку и нативно отключается.

@lossir
Copy link
Member

lossir commented Feb 11, 2022

Это старый баг в React - facebook/react#10109

Суть его в том, что есть обернуть выключенную кнопку, например, в спан, то на этом самом спане перестанут вызываться некоторые события мыши.

<span onMouseEnter={/* если кнопка занимает всю площадь, то никогда не вызовется */}>
   <button disabled>button</button>
</span>

В нативных элементах такого нет. Там события нормально всплывают.
Сделал небольшой пример: react-bug-mouseenter-button-disabled

@JackUait
Copy link
Contributor

В оригинальном issue идёт речь о том, что при переходе с активного элемента на отключенный перестают вызываться события onMouseEnter (если оставаться внутри этих двух элементов)

Пример №1: Элементы стоят вплотную друг к другу
На видео: навожу мышку на активную кнопку (вызывается событие onMouseEnter), затем перевожу мышку на отключенную кнопку, затем возвращаю мышку на активную кнопку (событие onMouseEnter уже не вызывается).

2022-02-11.11.27.07.mov

Пример №2: Между элементами есть два пикселя расстояния
На видео: навожу мышку на активную кнопку (вызывается событие onMouseEnter), затем перевожу мышку на отключенную кнопку, затем возвращаю мышку на активную кнопку (снова вызывается событие onMouseEnter).

2022-02-11.11.39.09.mov

В этом issue как раз происходят события из первого примера.

Но самое интересное происходит в следующем примере. В нём я воспроизвожу логику первых двух примеров, но уже внутри библиотеки. Красный и синий прямоугольники служат обозначением границ элементов.

Пример №3: Элементы стоят вплотную друг к другу, но уже внутри библиотеки
На видео: навожу мышку на активную кнопку (вызывается событие onMouseEnter), затем перевожу мышку на отключенную кнопку, затем возвращаю мышку на активную кнопку (снова вызывается событие onMouseEnter).

2022-02-11.12.07.26.mov

То есть поведение из этого issue действительно не воспроизводится в текущей версии библиотеки, по крайней мере на MenuItem.


Как ты отметил, это происходит потому, что ломается стандартное поведение и событие onMouseEnter не всплывает, но на самом деле нас не особо волнует юзкейс с оборачиванием в span и вызыванием onMouseEnter непосредственно на этом span'е, так как это ломает очень многие механизмы внутри HTML, которые в основном связаны с доступностью интерфейсов. В текущей реализации события происходят там, где они должны происходить - непосредственно на элементе кнопки.

Механизм всплытия событий в принципе нужен HTML для внутреннего пользования, мы - как пользователи HTML должны прикасаться к нему, только если по-другому никак.

@JackUait
Copy link
Contributor

P.S.

Не уверен, что это поведение когда-либо пофиксят внутри самого React, а если и пофиксят это случится минимум в 19-ой версии React, то есть через 2-3 года. Уже предпринимались попытки исправить это поведение, но они не увенчались успехом.

@lossir
Copy link
Member

lossir commented Feb 11, 2022

У нас не воспроизводится, потому-что я пофиксил это 3 года назад ))
1c88969

@JackUait
Copy link
Contributor

Хах, тогда тем более, зачем держать открытое issue)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

5 participants