Skip to content

Commit c4117bf

Browse files
committed
mouseeneter/mouseleave
1 parent 6f51a2b commit c4117bf

File tree

1 file changed

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

1 file changed

+36
-36
lines changed

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

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Движение: mouseover/-out, mouseenter/-leave
1+
# Движение: mouseover/out, mouseenter/leave
22

33
В этой главе мы более подробно рассмотрим события, возникающие при движении указателя (курсора) мыши над элементами страницы.
44

@@ -84,7 +84,7 @@
8484

8585
На примере ниже можно увидеть забавную последовательность сгенерированных событий.
8686

87-
Красный `<div>` находится внутри синего. На синем `<div>`-е определены обработчики событий `mouseover/-out`, которые отображают всю информацию по ним в текстовое поле ниже.
87+
Красный `<div>` находится внутри синего. На синем `<div>`-е определены обработчики событий `mouseover/out`, которые отображают всю информацию по ним в текстовое поле ниже.
8888

8989
Попробуйте зайти курсором на синий элемент, а затем перейдите на красный -- и смотрите, какие события сгенерировались:
9090

@@ -96,43 +96,43 @@
9696

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

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

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

103-
## Events mouseenter and mouseleave
103+
## События mouseenter и mouseleave
104104

105-
Events `mouseenter/mouseleave` are like `mouseover/mouseout`. They also trigger when the mouse pointer enters/leaves the element.
105+
События `mouseenter/mouseleave` похожи на `mouseover/mouseout`. Они тоже генерируются, когда курсор мыши заходит на элемент или покидает его.
106106

107-
But there are two differences:
107+
Но есть и пара важных отличий:
108108

109-
1. Transitions inside the element are not counted.
110-
2. Events `mouseenter/mouseleave` do not bubble.
109+
1. Переходы внутри элемента на дочерние элементы не считаются.
110+
2. События `mouseenter/mouseleave` не всплывают.
111111

112-
These events are intuitively very clear.
112+
Эти события интуитивно очень понятны.
113113

114-
When the pointer enters an element -- the `mouseenter` triggers, and then doesn't matter where it goes while inside the element. The `mouseleave` event only triggers when the cursor leaves it.
114+
Когда курсор становится над элементом -- генерируется `mouseenter`, и не имеет значения, где именно находится курсор внутри элемента. Событие `mouseleave` происходит, когда курсор покидает элемент.
115115

116-
If we make the same example, but put `mouseenter/mouseleave` on the blue `<div>`, and do the same -- we can see that events trigger only on entering and leaving the blue `<div>`. No extra events when going to the red one and back. Children are ignored.
116+
Если мы вернёмся к одному из прошлых примеров и в этот раз поставим обработчики событий `mouseenter/mouseleave` на синий `<div>`, а далее произведем те же действия -- мы увидим, что сгенерируются только события, связанные с движением курсора относительно синего `<div>`. Ничего не произойдет при переходе на красный `<div>` и обратно. Переходы с/на дочерние элементы игнорируются.
117117

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

120-
## Event delegation
120+
## Делегирование событий
121121

122-
Events `mouseenter/leave` are very simple and easy to use. But they do not bubble. So we can't use event delegation with them.
122+
События `mouseenter/leave` простые и легкие в использовании. Но они не всплывают. Таким образом, мы не можем их делегировать.
123123

124-
Imagine we want to handle mouse enter/leave for table cells. And there are hundreds of cells.
124+
Представьте ситуацию, что мы хотим обрабатывать события, сгенерированные при движении курсора по ячейкам таблицы. И в таблице сотни ячеек.
125125

126-
The natural solution would be -- to set the handler on `<table>` and process events there. But `mouseenter/leave` don't bubble. So if such event happens on `<td>`, then only a handler on that `<td>` can catch it.
126+
Очевидное решение -- определить обработчик на родительском элементе `<table>` и там обрабатывать возникающие события. Но `mouseenter/leave` не всплывают. То есть если событие происходит на ячейке `<td>`, то только обработчик на `<td>` может поймать его.
127127

128-
Handlers for `mouseenter/leave` on `<table>` only trigger on entering/leaving the whole table. It's impossible to get any information about transitions inside it.
128+
Обработчики событий `mouseenter/leave` на `<table>` срабатывают, если курсор оказывается над таблицей в целом или же уходит с неё. Невозможно получить какую-либо информацию о переходах между ячейками внутри таблицы.
129129

130-
Not a problem -- let's use `mouseover/mouseout`.
130+
Не проблема -- давайте использовать `mouseover/mouseout`.
131131

132-
A simple handler may look like this:
132+
Простой обработчик может выглядеть так:
133133

134134
```js
135-
// let's highlight cells under mouse
135+
// Давайте выделим ячейки под курсором
136136
table.onmouseover = function(event) {
137137
let target = event.target;
138138
target.style.background = 'pink';
@@ -148,38 +148,38 @@ table.onmouseout = function(event) {
148148
[codetabs height=480 src="mouseenter-mouseleave-delegation"]
149149
```
150150

151-
These handlers work when going from any element to any inside the table.
151+
Эти обработчики срабатывают, когда курсор передвигается между элементами внутри таблицы (не только `<td>`).
152152

153-
But we'd like to handle only transitions in and out of `<td>` as a whole. And highlight the cells as a whole. We don't want to handle transitions that happen between the children of `<td>`.
153+
Но мы бы хотели, чтобы они срабатывали только на переходах между ячейками и выделяли ячейку целиком. Мы не хотим обрабатывать события переходов курсора между элементами внутри ячейки `<td>`.
154154

155-
One of solutions:
155+
Одно из решений:
156156

157-
- Remember the currently highlighted `<td>` in a variable.
158-
- On `mouseover` -- ignore the event if we're still inside the current `<td>`.
159-
- On `mouseout` -- ignore if we didn't leave the current `<td>`.
157+
- Запоминать выделенную в данный момент ячейку `<td>` в переменную.
158+
- На `mouseover` -- игнорировать событие, если мы всё ещё внутри той же самой ячейки `<td>`.
159+
- На `mouseout` -- игнорировать событие, если это не уход с текущей ячейки `<td>`.
160160

161-
That filters out "extra" events when we are moving between the children of `<td>`.
161+
Это отфильтровывает все лишние события, возникающие при переходе курсора между дочерними элементами `<td>`.
162162

163163
```offline
164-
The details are in the [full example](sandbox:mouseenter-mouseleave-delegation-2).
164+
Детали реализации в [полном примере](sandbox:mouseenter-mouseleave-delegation-2).
165165
```
166166

167167
```online
168-
Here's the full example with all details:
168+
Полный пример со всеми деталями:
169169
170170
[codetabs height=380 src="mouseenter-mouseleave-delegation-2"]
171171
172-
Try to move the cursor in and out of table cells and inside them. Fast or slow -- doesn't matter. Only `<td>` as a whole is highlighted unlike the example before.
172+
Попробуйте подвигать курсор между ячейками и внутри них. Быстро или медленно - без разницы. В отличие от предыдущего примера выделяется только сама ячейка `<td>`.
173173
```
174174

175175

176-
## Summary
176+
## Итого
177177

178-
We covered events `mouseover`, `mouseout`, `mousemove`, `mouseenter` and `mouseleave`.
178+
Мы рассмотрели события `mouseover`, `mouseout`, `mousemove`, `mouseenter` и `mouseleave`.
179179

180-
Things that are good to note:
180+
Стоит отметить, что:
181181

182-
- A fast mouse move can make `mouseover, mousemove, mouseout` to skip intermediate elements.
183-
- Events `mouseover/out` and `mouseenter/leave` have an additional target: `relatedTarget`. That's the element that we are coming from/to, complementary to `target`.
184-
- Events `mouseover/out` trigger even when we go from the parent element to a child element. They assume that the mouse can be only over one element at one time -- the deepest one.
185-
- Events `mouseenter/leave` do not bubble and do not trigger when the mouse goes to a child element. They only track whether the mouse comes inside and outside the element as a whole.
182+
- Быстрое движение мышкой может не запустить события `mouseover, mousemove, mouseout` на промежуточных элементах.
183+
- События `mouseover/out` и `mouseenter/leave` имеют дополнительное свойство: `relatedTarget`. Оно дополняет свойство `target` и содержит ссылку на элемент, с/на который мы переходим.
184+
- События `mouseover/out` запускаются, даже когда происходит переход с родительского на дочерний элемент. В этом случае предполагается, что курсор мыши может быть только над одним элементом в любой момент времени - над самым глубоко вложенным.
185+
- События `mouseenter/leave` не всплывают и не генерируются, когда курсор переходит на дочерний элемент. Они следят только за переходами с/на сам элемент, не принимая во внимание его дочерние элементы.

0 commit comments

Comments
 (0)