Skip to content

Commit 748fc8b

Browse files
committed
mouseenter/mouseleave правки
1 parent c4117bf commit 748fc8b

File tree

1 file changed

+14
-14
lines changed
  • 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave

1 file changed

+14
-14
lines changed

2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@
1212

1313
Для события `mouseover`:
1414

15-
- `event.target` -- это элемент, на который курсор зашёл.
15+
- `event.target` -- это элемент, на который курсор перешёл.
1616
- `event.relatedTarget` -- это элемент, с которого курсор ушёл.
1717

1818
Для события `mouseout` наоборот:
1919

2020
- `event.target` -- это элемент, с которого курсор ушёл.
21-
- `event.relatedTarget` -- это элемент, на который курсор зашёл.
21+
- `event.relatedTarget` -- это элемент, на который курсор перешёл.
2222

2323
```online
2424
В примере ниже каждое изображение - отдельный элемент. При движении курсора по этим элементам в текстовом поле отображаются произошедшие события.
2525
26-
Каждое из них содержит информацию о том, откуда на соответствующий элемент пришёл и куда с него ушёл курсор.
26+
Каждое из них содержит информацию о том, откуда на соответствующий элемент перешёл и куда с него ушёл курсор.
2727
2828
[codetabs src="mouseoverout" height=280]
2929
```
3030

3131
```warn header="Свойство `relatedTarget` может быть `null`"
3232
Свойство `relatedTarget` может быть `null`.
3333

34-
Это нормально и означает, что указатель мыши пришёл не с другого элемента, а из-за пределов окна браузера. Или же, наоборот, ушёл за пределы окна.
34+
Это нормально и означает, что указатель мыши перешёл не с другого элемента, а из-за пределов окна браузера. Или же, наоборот, ушёл за пределы окна.
3535

3636
Разработчикам следует держать в голове такие варианты при использовании `event.relatedTarget` в своём коде. Если, например, написать `event.relatedTarget.tagName`, то при отсутствии `event.relatedTarget` будет ошибка.
3737
```
@@ -57,7 +57,7 @@
5757
![](mouseover-mouseout-from-outside.png)
5858
5959
<div style="display:none">
60-
В случае быстрого прохождения курсором промежуточных элементов события вообще могут не генерироваться. Но если уж курсор пришёл на элемент (было сгенерировано `mouseover`), то гарантировано при выходе с того элемента будет запущено событие `mouseout`.
60+
В случае быстрого прохождения курсором промежуточных элементов события вообще могут не генерироваться. Но если уж курсор перешёл на элемент (было сгенерировано `mouseover`), то гарантировано при выходе с того элемента будет запущено событие `mouseout`.
6161
</div>
6262
6363
```online
@@ -72,13 +72,13 @@
7272

7373
## "Лишний" mouseout при уходе на потомка
7474

75-
Представьте ситуацию -- курсор мыши зашёл на элемент. Сгенерировано событие `mouseover`. Затем курсор перешёл на дочерний элемент. Интересно, что в таком случае будет сгенерировано `mouseout`. То есть курсор всё ещё на элементе, но мы получили `mouseout`!
75+
Представьте ситуацию -- курсор мыши перешёл на элемент. Сгенерировано событие `mouseover`. Затем курсор перешёл на дочерний элемент. Интересно, что в таком случае будет сгенерировано `mouseout`. То есть курсор всё ещё на элементе, но мы получили `mouseout`!
7676

7777
![](mouseover-to-child.png)
7878

7979
Это выглядит странно, но легко объясняется.
8080

81-
**По логике браузера, курсор мыши может быть только над одним элементом в любой момент времени - над самым глубоко вложенным (и имеющим самое большое значение z-index).**
81+
**По логике браузера, курсор мыши может быть только над одним элементом в любой момент времени - над самым глубоко вложенным (и/или имеющим приоритетное значение z-index).**
8282

8383
Таким образом, если курсор переходит на другой элемент (пусть даже дочерний), то он покидает предыдущий. Достаточно просто.
8484

@@ -91,37 +91,37 @@
9191
[codetabs height=360 src="mouseoverout-child"]
9292

9393
1. При входе на синий элемент -- мы получили `mouseover [target: blue]`.
94-
2. Затем при переходе на красный -- `mouseout [target: blue]` (уход с родителя).
94+
2. Затем при переходе с синего на красный -- `mouseout [target: blue]` (уход с родителя).
9595
3. ...и сразу же `mouseover [target: red]`.
9696

97-
Таким образом, для обработчика, который не принимает во внимание свойство `target`, ситуация выглядит так, как будто курсор ушёл с родительского элемента, запустив `mouseout` на строке `(2)`, а затем вернулся обратно, запустив `mouseover` на строке `(3)`.
97+
Таким образом, для обработчика, который не принимает во внимание свойство `target`, ситуация выглядит так, как будто курсор ушёл с родительского элемента, запустив `mouseout` `(2)`, а затем вернулся обратно, запустив `mouseover` `(3)`.
9898

9999
Если постоянно передвигать курсор мышки с/на элемент, то мы получим много "ложных" срабатываний обработчиков. В простых случаях это может быть незаметно для пользователя, но в сложных случаях могут проявляться нежелательные побочные эффекты.
100100

101101
Чтобы их избежать, можно использовать события `mouseenter/mouseleave`.
102102

103103
## События mouseenter и mouseleave
104104

105-
События `mouseenter/mouseleave` похожи на `mouseover/mouseout`. Они тоже генерируются, когда курсор мыши заходит на элемент или покидает его.
105+
События `mouseenter/mouseleave` похожи на `mouseover/mouseout`. Они тоже генерируются, когда курсор мыши переходит на элемент или покидает его.
106106

107107
Но есть и пара важных отличий:
108108

109-
1. Переходы внутри элемента на дочерние элементы не считаются.
109+
1. Переходы внутри элемента по дочерним элементам не считаются.
110110
2. События `mouseenter/mouseleave` не всплывают.
111111

112112
Эти события интуитивно очень понятны.
113113

114114
Когда курсор становится над элементом -- генерируется `mouseenter`, и не имеет значения, где именно находится курсор внутри элемента. Событие `mouseleave` происходит, когда курсор покидает элемент.
115115

116-
Если мы вернёмся к одному из прошлых примеров и в этот раз поставим обработчики событий `mouseenter/mouseleave` на синий `<div>`, а далее произведем те же действия -- мы увидим, что сгенерируются только события, связанные с движением курсора относительно синего `<div>`. Ничего не произойдет при переходе на красный `<div>` и обратно. Переходы с/на дочерние элементы игнорируются.
116+
Если мы вернёмся к одному из прошлых примеров и в этот раз поставим обработчики событий `mouseenter/mouseleave` на синий `<div>`, а далее произведём те же действия -- мы увидим, что сгенерируются только события, связанные с движением курсора относительно синего `<div>`. Ничего не произойдет при переходе на красный `<div>` и обратно. Переходы с/на дочерние элементы игнорируются.
117117

118118
[codetabs height=340 src="mouseleave"]
119119

120120
## Делегирование событий
121121

122122
События `mouseenter/leave` простые и легкие в использовании. Но они не всплывают. Таким образом, мы не можем их делегировать.
123123

124-
Представьте ситуацию, что мы хотим обрабатывать события, сгенерированные при движении курсора по ячейкам таблицы. И в таблице сотни ячеек.
124+
Представьте ситуацию, когда мы хотим обрабатывать события, сгенерированные при движении курсора по ячейкам таблицы. И в таблице сотни ячеек.
125125

126126
Очевидное решение -- определить обработчик на родительском элементе `<table>` и там обрабатывать возникающие события. Но `mouseenter/leave` не всплывают. То есть если событие происходит на ячейке `<td>`, то только обработчик на `<td>` может поймать его.
127127

@@ -182,4 +182,4 @@ table.onmouseout = function(event) {
182182
- Быстрое движение мышкой может не запустить события `mouseover, mousemove, mouseout` на промежуточных элементах.
183183
- События `mouseover/out` и `mouseenter/leave` имеют дополнительное свойство: `relatedTarget`. Оно дополняет свойство `target` и содержит ссылку на элемент, с/на который мы переходим.
184184
- События `mouseover/out` запускаются, даже когда происходит переход с родительского на дочерний элемент. В этом случае предполагается, что курсор мыши может быть только над одним элементом в любой момент времени - над самым глубоко вложенным.
185-
- События `mouseenter/leave` не всплывают и не генерируются, когда курсор переходит на дочерний элемент. Они следят только за переходами с/на сам элемент, не принимая во внимание его дочерние элементы.
185+
- События `mouseenter/leave` не всплывают и не генерируются, когда курсор переходит на дочерний элемент. Они запускаются только при переходах с/на сам элемент, не принимая во внимание его дочерние элементы.

0 commit comments

Comments
 (0)