Введение в JavaScript
JavaScript везде
2
Как работает JavaScript
JavaScript
3
Как работает JavaScript
HTML
JavaScript
CSS
3
Как работает JavaScript
HTML
JavaScript DOM
CSS
3
Document Object Model
<html>
<body>
<h1>HTML Academy</h1>
<p>
<img src="logo.png" alt="">
</p>
</body>
</html>
https://developer.mozilla.org/ru/docs/DOM/DOM_Reference/Введение
4
Document Object Model
<html>
<body>
HTMLHtmlElement
<h1>HTML Academy</h1>
<p>
<img src="logo.png" alt="">
</p> HTMLBodyElement
</body>
</html>
HTMLHeadingElement HTMLParagraphElement
Text HTMLImageElement
https://developer.mozilla.org/ru/docs/DOM/DOM_Reference/Введение
4
5
document
Глобальный объект; является корневым элементом
DOM-дерева страницы.
6
7
Три главных слова
– querySelector()
Метод для поиска элементов.
8
Три главных слова
– querySelector()
Метод для поиска элементов.
– addEventListener()
Метод для отлова диких событий.
8
Три главных слова
– querySelector()
Метод для поиска элементов.
– addEventListener()
Метод для отлова диких событий.
– classList
Набор методов для управления классами.
8
querySelector
Возвращает элемент из DOM-дерева,
соответствующий CSS-селектору.
9
querySelector
document.querySelector(".user-block"); 4
1
3.5
12
https://developer.mozilla.org/ru/docs/Web/API/Document/querySelector
10
querySelector
document.querySelector(".user-block"); 4
1 2
3.5
https://developer.mozilla.org/ru/docs/Web/API/Document/querySelector
10
querySelector
document.querySelector(".user-block"); 4
1 2 3
3.5
https://developer.mozilla.org/ru/docs/Web/API/Document/querySelector
10
Форма входа
11
Найдём ссылку вход
…
<div class="main-navigation-wrapper">
<div class="container">
<ul class="site-navigation">
<li><a href="info.html">Информация</a></li>
<li><a href="news.html">Новости</a></li>
<li><a href="price.html">Прайс-лист</a></li>
<li><a href="catalog.html">Магазин</a></li>
<li><a href="contacts.html">Контакты</a></li>
</ul>
<ul class="user-navigation">
<li><a class="login-link" href="login.html">Вход</a></li>
</ul>
</div>
</div>
12
Найдём ссылку вход
<html>
<body>
…
<script>
</script>
</body>
</html>
13
Найдём ссылку вход
<html>
<body>
…
<script>
var link = document.querySelector(".login-link");
</script>
</body>
</html>
13
Найдём ссылку вход
1
3.5
элемент.
12
https://htmlacademy.ru/courses/207
14
Найдём ссылку вход
1 2
3.5
элемент.
12
https://htmlacademy.ru/courses/207
14
Найдём ссылку вход
1 2 3
3.5
элемент.
12
https://htmlacademy.ru/courses/207
14
15
16
querySelectorAll
Возвращает все элементы из DOM-дерева,
соответствующие CSS-селектору.
17
querySelectorAll
document.querySelectorAll("nav li"); 4
1
3.5
12
https://developer.mozilla.org/ru/docs/Web/API/Document/querySelectorAll
18
querySelectorAll
document.querySelectorAll("nav li"); 4
1 2
3.5
https://developer.mozilla.org/ru/docs/Web/API/Document/querySelectorAll
18
querySelectorAll
document.querySelectorAll("nav li"); 4
1 2 3
3.5
https://developer.mozilla.org/ru/docs/Web/API/Document/querySelectorAll
18
19
20
Сообщение в браузере
console.log("какой-то текст"); 1
12
https://developer.mozilla.org/ru/docs/Web/API/Console/log
21
Сообщение в браузере
console.log("какой-то текст"); 1
12
https://developer.mozilla.org/ru/docs/Web/API/Console/log
21
addEventListener
Отлавливает событие элемента и выполняет
переданную функцию.
22
addEventListener
1
1
12
https://developer.mozilla.org/ru/docs/Web/API/EventTarget/addEventListener
23
addEventListener
1 2
1
https://developer.mozilla.org/ru/docs/Web/API/EventTarget/addEventListener
23
addEventListener
1 2 3
1
https://developer.mozilla.org/ru/docs/Web/API/EventTarget/addEventListener
23
addEventListener
1 2 3 4
1
https://developer.mozilla.org/ru/docs/Web/API/EventTarget/addEventListener
23
Какие события можно поймать
Мышиные события 1
mouseenter, mouseover, mousemove, mousedown, mouseup, click, dblclick,
contextmenu, wheel, mouseleave, mouseout, select 1
1
Клавиатурные события
keydown, keypress, keyup
12
События фокуса 9
focus, blur
События формы
reset, submit
Сетевые события
online, offline
https://developer.mozilla.org/ru/docs/Web/Events
24
Поймаем клик на ссылку вход
…
<script>
</script>
25
Поймаем клик на ссылку вход
…
<script>
link.addEventListener("click", function () {
});
</script>
25
Поймаем клик на ссылку вход
…
<script>
link.addEventListener("click", function () {
console.log("Клик по ссылке вход");
});
</script>
25
26
27
28
Поймаем клик на ссылку вход
…
<script>
evt.preventDefault();
console.log("Клик по ссылке вход");
});
</script>
https://developer.mozilla.org/ru/docs/Web/API/Event/preventDefault
29
30
Найдём модальное окно
…
<script>
</script>
31
32
33
classList
Набор методов для управления классами элемента.
34
classList
element.classList.add("modal-show"); 8
1
3.6
12
10
https://developer.mozilla.org/ru/docs/Web/API/Element/classList
35
classList
element.classList.add("modal-show"); 8
1 2
3.6
10
https://developer.mozilla.org/ru/docs/Web/API/Element/classList
35
classList
element.classList.add("modal-show"); 8
1 2 3
3.6
https://developer.mozilla.org/ru/docs/Web/API/Element/classList
35
classList
element.classList.add("modal-show"); 8
1 2 3 4
3.6
https://developer.mozilla.org/ru/docs/Web/API/Element/classList
35
classList
– element.classList.add(); 8
Добавляет класс.
3.6
– element.classList.remove(); 5.1
Удаляет класс.
12
– element.classList.toggle();
10
Переключает класс.
– element.classList.contains();
Сообщает, есть ли класс у элемента.
36
Покажем модальное окно
<style>
.modal {
display: none;
…
}
.modal-show {
display: block;
}
</style>
<script>
</script>
37
Покажем модальное окно
<style>
.modal {
display: none;
…
}
.modal-show {
display: block;
}
</style>
<script>
</script>
37
Покажем модальное окно
<style>
.modal {
display: none;
…
}
.modal-show {
display: block;
} Без «точки»
Использовать .modal-show — ошибка
</style>
<script>
</script>
37
Покажем модальное окно
<style>
.modal-show {
display: block;
} Без «точки»
Использовать .modal-show — ошибка
</style>
<script>
</script>
37
Покажем модальное окно
<style>
.modal-show {
display: block;
} Без «точки»
Использовать .modal-show — ошибка
</style>
<script>
</script>
37
38
Соединяем скрипт вместе
<script>
</script>
39
А как закрыть модальное окно?
…
<script>
</script>
40
А как закрыть модальное окно?
…
<script>
…
</script>
40
Промежуточный итог №1
<script>
</script>
41
Сделаем форму удобной
Фокус на поле ввода
<script>
});
</script>
43
Фокус на поле ввода
<script>
});
</script>
43
Фокус на поле ввода
<script>
login.focus();
});
</script>
43
44
45
Проверим форму через HTML
…
46
47
Проверим форму
<script>
…
</script>
48
49
Проверим форму
<script>
…
form.addEventListener("submit", function () {
console.log("Отправляем форму");
});
</script>
50
51
52
Проверим форму
<script>
…
evt.preventDefault();
console.log("Отправляем форму");
});
</script>
53
54
55
Проверим форму
<script>
…
});
</script>
56
Проверим форму
<script>
…
</script>
56
57
58
59
Проверим форму
<script>
…
</script>
60
Условие
if (!login.value) { … }
1
https://htmlacademy.ru/courses/209
61
Условие
if (!login.value) { … }
1 2
https://htmlacademy.ru/courses/209
61
Условие
if (!login.value) { … }
1 3 2
https://htmlacademy.ru/courses/209
61
Условие
https://htmlacademy.ru/courses/209
62
Условие
if (!login.value || !password.value) { … }
1
https://htmlacademy.ru/courses/209
63
Условие
if (!login.value || !password.value) { … }
1 2
https://htmlacademy.ru/courses/209
63
64
65
Промежуточный итог №2
<script>
var link = document.querySelector(".login-link");
var popup = document.querySelector(".modal-login");
var close = popup.querySelector(".modal-close");
var form = popup.querySelector("form");
var login = popup.querySelector("[name=login]");
var password = popup.querySelector("[name=password]");
67
localStorage
localStorage.setItem("name", "keks"); 4
1
3.5
12
https://htmlacademy.ru/courses/74/run/26
68
localStorage
localStorage.setItem("name", "keks"); 4
1 2
3.5
https://htmlacademy.ru/courses/74/run/26
68
localStorage
localStorage.setItem("name", "keks"); 4
1 2 3
3.5
3. Ключ записи. 8
https://htmlacademy.ru/courses/74/run/26
68
localStorage
localStorage.setItem("name", "keks"); 4
1 2 3 4
3.5
3. Ключ записи. 8
4. Значение записи.
https://htmlacademy.ru/courses/74/run/26
68
localStorage
– localStorage.getItem(); 4
– localStorage.setItem(); 4
– localStorage.removeItem();
8
Удаляет запись из хранилища.
– localStorage.clear();
Полностью очищает хранилище.
https://developer.mozilla.org/ru/docs/Web/API/Window/localStorage
69
Сколько места?
70
Сколько места?
70
71
Запомним логин
<script>
…
});
</script>
https://htmlacademy.ru/courses/209
72
Запомним логин
<script>
…
}
});
</script>
https://htmlacademy.ru/courses/209
72
Запомним логин
<script>
…
</script>
https://htmlacademy.ru/courses/209
72
Запомним логин
<script> …
var popup = document.querySelector(".modal-login");
var form = popup.querySelector("form");
var login = popup.querySelector("[name=login]");
var password = popup.querySelector("[name=password]");
});
…
</script>
73
Запомним логин
<script> …
var popup = document.querySelector(".modal-login");
var form = popup.querySelector("form");
var login = popup.querySelector("[name=login]");
var password = popup.querySelector("[name=password]");
var storage = localStorage.getItem("login");
});
…
</script>
73
Запомним логин
<script> …
var popup = document.querySelector(".modal-login");
var form = popup.querySelector("form");
var login = popup.querySelector("[name=login]");
var password = popup.querySelector("[name=password]");
var storage = localStorage.getItem("login");
}
});
…
</script>
73
74
Однако
localStorage может работать не всегда.
75
76
Убеждаемся, что localStorage существует
<script> …
var form = popup.querySelector("form");
var login = popup.querySelector("[name=login]");
var password = popup.querySelector("[name=password]");
try {
storage = localStorage.getItem("login");
} catch (err) {
isStorageSupport = false;
}
…
</script>
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/try...catch
77
Убеждаемся, что localStorage существует
<script> …
form.addEventListener("submit", function (evt) {
if (!login.value || !password.value) {
evt.preventDefault();
console.log("Нужно ввести логин и пароль");
} else {
if (isStorageSupport) {
localStorage.setItem("login", login.value);
}
}
});
…
</script>
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/try...catch
78
79
Сместим фокус на пароль
<script> …
link.addEventListener("click", function (evt) {
evt.preventDefault();
popup.classList.add("modal-show");
if (storage) {
login.value = storage;
password.focus();
} else {
login.focus();
}
});
…
</script>
80
81
window
Глобальный объект; занимается окном, внутри
которого находится DOM-дерево.
82
83
Закроем модальное окно по ESC
<script> …
</script>
84
Реагируем только на клавишу ESC
<script> …
26
</script>
6
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
85
Реагируем только на открытый попап
<script> …
if (popup.classList.contains("modal-show")) {
…
}
}
});
</script>
86
Отменяем действия по умолчанию
<script> …
if (popup.classList.contains("modal-show")) {
evt.preventDefault();
}
}
});
</script>
87
Закрываем модальное окно
<script> …
if (popup.classList.contains("modal-show")) {
evt.preventDefault();
popup.classList.remove("modal-show");
}
}
});
</script>
88
Промежуточный итог №3
<script> });
var link = document.querySelector(".login-link");
var popup = document.querySelector(".modal-login"); close.addEventListener("click", function (evt) {
var close = popup.querySelector(".modal-close"); evt.preventDefault();
var form = popup.querySelector("form"); popup.classList.remove("modal-show");
var login = popup.querySelector("[name=login]"); });
var password = popup.querySelector("[name=password]");
form.addEventListener("submit", function (evt) {
var isStorageSupport = true; if (!login.value || !password.value) {
var storage = ""; evt.preventDefault();
console.log("Нужно ввести логин и пароль");
try { } else {
storage = localStorage.getItem("login"); if (isStorageSupport) {
} catch (err) { localStorage.setItem("login", login.value);
isStorageSupport = false; }
} }
});
link.addEventListener("click", function (evt) {
evt.preventDefault(); window.addEventListener("keydown", function (evt) {
popup.classList.add("modal-show"); if (evt.keyCode === 27) {
if (popup.classList.contains("modal-show")) {
if (storage) { evt.preventDefault();
login.value = storage; popup.classList.remove("modal-show");
password.focus(); }
} else { }
login.focus(); });
} </script>
89
Добавим анимации
Плавно спустим форму
<style>
4
…
5
@keyframes bounce {
0% { transform: translateY(-2000px); }
4
70% { transform: translateY(30px); }
90% { transform: translateY(-10px); }
100% { transform: translateY(0); } 12
}
10
.modal-show {
display: block;
animation-name: bounce;
animation-duration: 0.6s;
}
</style>
https://htmlacademy.ru/courses/80
91
Демонстрация:
анимация появления формы
https://up.htmlacademy.ru/htmlcss/25/demos/2263#29
92
Потрясём форму
<style>
… 4
@keyframes shake { 5
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
4
20%, 40%, 60%, 80% { transform: translateX(10px); }
}
12
.modal-error {
animation-name: shake; 10
animation-duration: 0.6s;
</style>
https://htmlacademy.ru/courses/80
93
Потрясём форму
<script> …
…
</script>
94
Потрясём форму
<script> …
…
</script>
94
Демонстрация:
анимация при ошибке в форме
https://up.htmlacademy.ru/htmlcss/25/demos/2263#30
95
Скрипт готов
<script> evt.preventDefault();
var link = document.querySelector(".login-link"); popup.classList.remove("modal-show");
var popup = document.querySelector(".modal-login"); popup.classList.remove("modal-error");
var close = popup.querySelector(".modal-close"); });
var form = popup.querySelector("form");
var login = popup.querySelector("[name=login]"); form.addEventListener("submit", function (evt) {
var password = popup.querySelector("[name=password]"); if (!login.value || !password.value) {
evt.preventDefault();
var isStorageSupport = true; popup.classList.remove("modal-error");
var storage = ""; popup.offsetWidth = popup.offsetWidth;
popup.classList.add("modal-error");
try { } else {
storage = localStorage.getItem("login"); if (isStorageSupport) {
} catch (err) { localStorage.setItem("login", login.value);
isStorageSupport = false; }
} }
});
link.addEventListener("click", function (evt) {
evt.preventDefault(); window.addEventListener("keydown", function (evt) {
popup.classList.add("modal-show"); if (evt.keyCode === 27) {
if (popup.classList.contains("modal-show")) {
if (storage) { evt.preventDefault();
login.value = storage; popup.classList.remove("modal-show");
password.focus(); popup.classList.remove("modal-error");
} else { }
login.focus(); }
} });
}); </script>
<script src="js/popup.js"></script>
</body>
</html>
97
Как проехать
98
Как проехать
99
Откроем модальное окно
…
<section class="contacts">
…
100
Откроем модальное окно
var link = document.querySelector(".contacts-button-map"); }
});
var popup = document.querySelector(".modal-map");
var close = popup.querySelector(".modal-close");
101
Откроем модальное окно
var mapLink = document.querySelector(".contacts-button-map"); }
});
var mapPopup = document.querySelector(".modal-map");
var mapClose = mapPopup.querySelector(".modal-close");
102
Разбираемся с Google картой
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m…" width="600" height="450" allowfullscreen></iframe>
1 2
https://www.google.ru/maps
106
Встроим Google карту
…
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1998.654168778302!2d30.324424403167985!
3d59.93788053140718!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x4696310fca5ba729%3A0xea9c53d4493c879f!
2z0JHQvtC70YzRiNCw0Y8g0JrQvtC90Y7RiNC10L3QvdCw0Y8g0YPQuy4sIDE5LCDQodCw0L3QutGCLdCf0LXRgtC10YDQsdGD0YDQsywgMTkxMTg2!5e0!
<p><img src="img/map.jpg" width="766" height="560" alt="Офис компании по адресу ул. Большая Конюшенная 19/8, Санкт-
Петербург"></p>
<button class="modal-close" type="button">Закрыть</button>
</section>
107
108
Разбираемся с Яндекс картой
<iframe src="https://yandex.ru/map-widget/v1/-/CB…" width="560" height="400" allowfullscreen></iframe>
1 2
https://yandex.ru/maps
113
Встроим Яндекс карту
…
<p><img src="img/map.jpg" width="766" height="560" alt="Офис компании по адресу ул. Большая Конюшенная 19/8, Санкт-
Петербург"></p>
<button class="modal-close" type="button">Закрыть</button>
</section>
114
115
Скрипт в отдельный файл
…
<script src="js/popup.js"></script>
<script src="js/map.js"></script>
</body>
</html>
116
Проверяйте, что умеет браузер
117
Тестируйте скрипты
во всех браузерах
Что читать дальше
– Книжка с носорогом
https://www.ozon.ru/context/detail/id/141703512/
– Выразительный JavaScript
https://karmazzin.gitbooks.io/eloquentjavascript_ru/
119
Дополнительные критерии
Д14. Собственные скрипты собраны в отдельном JavaScript-файле, который
подключён в HTML перед закрывающим тегом body.
120
Задание на DOM
1. Основное задание: оживить интерактивные элементы в личном проекте.
121
126
Задание на DOM
1. Основное задание: оживить интерактивные элементы в личном проекте.
127
console.log(“Всем JavaScript!”)