-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLekcija_10.js
More file actions
162 lines (136 loc) · 6.55 KB
/
Copy pathLekcija_10.js
File metadata and controls
162 lines (136 loc) · 6.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*-------------*/
/* Почему при декларативной подписке на событие в HTML объект события передается */
/* через переменную event? */
/* Когда браузер парсит строку вида <div onclick="handleClick(event);">, он создает анонимную функцию как ниже */
/*-------------*/
var div = document.getElementById(""); // браузер находит элемент div
div.onclick = function (e) {
var event = e; // просто переменная с именем event, так договорились производители браузеров
--> копирует значение атрибута onclick
handleClick(event);
}
/*-------------*/
/* Пример подписки на hashchange */
/* Объект document.location дает всю информацию об адресе страницы: строка поиска, домен, порт, хеш */
/* Когда вы переходите по якорю, секция после # меняется и наступает событие hashchange */
/* hashchange является основным событием для SPA и таких инструментов как Angular, React, Ember и т.д. */
/*-------------*/
<script>
// Выводит новое значение секции хеша в консоль после ее изменения
window.onhashchange = () => console.log(document.location.hash);
</script>
/*-------------*/
/* Пример подписки на событие клавиатуры на этапе capture и bubble */
/*-------------*/
<input id="in">
<script>
var el = document.getElementById('in');
el.addEventListener('keypress', onPr, true);
el.addEventListener('keypress', onPr2, false);
function onPr(e) {
console.log("capture: " + e.key); // Вывод символа, который был нажат
};
function onPr2(e) {
console.log("bubble: " + e.key);
};
</script>
/*-------------*/
/* Пример отмены действия по умолчанию - отображения символа в поле ввода после нажатия кнопки */
/*-------------*/
<input id="in">
<script>
var el = document.getElementById('in');
el.addEventListener('keypress', onPr, true);
el.addEventListener('keypress', onPr2, false);
function onPr(e) {
e.preventDefault(); // можно на стадии capture
console.log("capture: " + e.key); // в консоль символ продолжает выводиться
};
function onPr2(e) {
e.preventDefault(); // а можно и на стадии bubble
console.log("bubble: " + e.key); // в консоль символ продолжает выводиться
};
</script>
/*-------------*/
/* Пример отмены стадии bubble для того же элемента */
/*-------------*/
<input id="in">
<script>
var el = document.getElementById('in');
el.addEventListener('keypress', onPr, true);
el.addEventListener('keypress', onPr2, false);
function onPr(e) {
e.stopImmediatePropagation(); // нужно делать на стадии capture
console.log("capture: " + e.key); // в консоль символ продолжает выводиться
};
function onPr2(e) {
// Этот обработчик события уже не вызывается
console.log("bubble: " + e.key);
};
</script>
/*-------------*/
/* Пример отмены стадии bubble при перехвате события родительским элементом, например body */
/*-------------*/
<input id="in">
<script>
document.body.addEventListener('keypress', onPr, true);
document.body.addEventListener('keypress', onPr2, false);
function onPr(e) {
e.stopPropagation(); // нужно делать на стадии capture
console.log("capture: " + e.key); // в консоль символ продолжает выводиться
};
function onPr2(e) {
// Этот обработчик события уже не вызывается
console.log("bubble: " + e.key);
};
</script>
/*-------------*/
/* Пример отображения текущих координат мыши с учетом масштаба в браузере */
/*-------------*/
<div
onmousemove="handleMouseMove(event)"
onmouseup="handleMouseUp(event)"
style="width:300px;height:300px;margin:100px auto;background:yellow"></div>
<script>
function handleMouseMove(e) {
// Когда мышь двигается в пределах элемента
e.currentTarget.innerHTML = `(${e.clientX}, ${e.clientY})`;
}
function handleMouseOut(e) {
e.currentTarget.innerHTML = ''; // Очистка, когда мышь ушла с элемента
}
</script>
/*-------------*/
/* Пример перетягивания блока мышью */
/*-------------*/
<div
onmousemove="handleMouseMove(event)"
onmousedown="handleMouseDown(event)"
onmouseup="handleMouseUp(event)"
onmouseout="handleMouseUp(event)"
style="width:300px;height:300px;position:absolute;background:yellow"></div>
<script>
var graggableObject = null; // Перемещаемый элемент
var xy = {}; // Начальные координаты элемента
function handleMouseDown(e) {
graggableObject = e.target; // Сохранить элемент-источник события
var s = getComputedStyle(graggableObject);
xy.top = s.top; // Запомнить его начальную координату Y верхней точки
xy.left = s.left; // Запомнить его начальную координату X верхней точки
xy.mtop = e.clientY; // Запомнить позицию курсора по Y в начальной точке
xy.mleft = e.clientX; // Запомнить позицию курсора по X в начальной точке
}
function handleMouseUp(e) {
graggableObject = null; // Очистка
xy = {};
}
function handleMouseMove(e) {
if (graggableObject) {
// при перемещении
// Присвоить Y верхней точки блока начальное значение плюс смещение мыши по Y
graggableObject.style.top = parseInt(xy.top) + (e.clientY - xy.mtop) + 'px';
// Присвоить X верхней точки блока начальное значение плюс смещение мыши по X
graggableObject.style.left = parseInt(xy.left) + (e.clientX - xy.mleft) + 'px';
}
}
</script>