Нехай у нас є елемент,на кліку на який виконається функція func:
<button id="elem">Елемент</button>
var elem = document.getElementById('elem');
elem.onclick = func;
function func() {
}
Усередині прив'язаної функції вже є об'єкт Event - ми поки що не знаємо, як його отримати. Виходить він так: потрібно при оголошенні нашої функції func передати до неї параметром будь-яку змінну (наприклад, event - але назва може бути будь-яким) і в цю змінну браузер автоматично покладе об'єкт Event:
elem.onclick = func;
function func(event) {
тут доступний об'єкт event
}
Це працює тільки для функцій, прив'язаних до будь-якої події.
Ще раз: якщо при прив'язуванні функції до цієї функції встановити параметр - у цей параметр браузер автоматично покладе об'єкт Event. Назва цього параметра буде будь-яким - як назвете, так і звертатиметеся до нього.
Об'єкт Event також містить тип події, наприклад для події onclick це click, Для onmouseover це mouseover і так далі. Доступ до типу події можна отримати так - event.type:
<button id="elem">Элемент</button>
var elem = document.getElementById('elem');
elem.onclick = func;
function(event) {
alert(event.type); //виведе 'click'
}
За допомогою event.target можна отримати елемент, у якому сталася подія. Навіщо це потрібно, якщо цей елемент міститься у this? Відповідь це питання дасть приклад нижче.
Нехай ми маємо div, а всередині нього абзац. Прив'яжемо подію до дива, але клацнемо по абзацу - у цьому випадку event.target міститиме кінцевий тег, в якому трапилася подія - тобто абзац, а не див. Переконайтеся в цьому за допомогою tagName:
<div id="elem">
<p>Абзац</p>
</div>
var div = document.getElementById('elem');
div.оnclick= func(event) {
var target = event.target;
alert(target.tagName); //виведе 'p' - абзац
}
На сторінці кнопка. При натисканні на кнопку вводяться два числа, знаходиться їхня сума та виводиться результат. Розглянемо різні варіанти розв'язання цієї задачі.
Функція без параметрів і без значення, що повертається. В атрибуті onclick кнопки пишемо код обробника події click - викликаємо функцію chet
<html>
<body>
<input type="button" value="Вычислить" onclick="chat();">
<script>
function chat()
{
str=prompt("Первое число=",0); x=Number(str);
str=prompt("Второе число=",0); y=Number(str);
s=x+y;
alert("Сумма="+s);
}
</script>
</body>
</html>
onclickchat() запитує два числа через promptNumber()alertФункція без параметрів із значенням суми, що повертається. В атрибуті onclick кнопки пишемо код обробника події click - викликаємо функцію chet і виводимо результат на екран.
<html>
<body>
<input type="button" value="Обчислити"
onclick="s=chat(); alert('Сума='+s);">
<script>
function chat()
{
str = prompt("Перше число=", 0);
x = Number(str);
str = prompt("Друге число=", 0);
y = Number(str);
s = x + y;
return s;
}
</script>
</body>
</html>
onclickchat():
promptNumber()alertФункція без параметрів і без значення, що повертається. Властивості onclick елемента c id="elem" присвоюємо значення chet. Тобто вказуємо, що у разі події click у елемента з id="elem" виконувати функцію chet.
<html>
<body>
<input type="button" value="Обчислити" id="elem">
<script>
// Отримуємо елемент за id і призначаємо обробник події
elem.onclick = chet;
function chet()
{
// Отримуємо перше число від користувача
str = prompt("Перше число=", 0);
x = Number(str);
// Отримуємо друге число від користувача
str = prompt("Друге число=", 0);
y = Number(str);
// Обчислюємо суму
s = x + y;
// Виводимо результат
alert("Сумма=" + s);
}
</script>
</body>
</html>
elem)chet призначається як обробник події onclickprompt для введення данихNumber()alertdocument.getElementById замість глобального доступуУ скрипті вводяться два числа, вони передаються як параметри у функцію. Результат, що повертається функцією, присвоюється змінною і потім виводиться.
Функція з двома параметрами та значенням, що повертається.
Властивості onclick елемента c id="elem" присвоюємо значення chet.
Тобто вказуємо, що у разі події click у елемента з id="elem" виконувати функцію chet.
<html>
<body>
<input type="button" value="Обчислити" id="elem">
<script>
// Отримуємо числа від користувача
st1 = prompt("Перше число=", 0);
st2 = prompt("Друге число=", 0);
// Обчислюємо суму
s = chet(st1, st2);
// Виводимо результат
alert("Сумма=" + s);
// Призначаємо обробник події
elem.onclick = chet;
function chet(st1, st2) {
// Перетворюємо рядки в числа
x = Number(st1);
y = Number(st2);
// Обчислюємо суму
s = x + y;
// Повертаємо результат
return s;
}
</script>
</body>
</html>
Код запитує числа при завантаженні сторінки, обчислює суму і виводить її.
Кнопка "Обчислити" призначена для повторного обчислення, але в поточному вигляді
вона не працюватиме коректно, оскільки функція chet не запитує
нові значення при кліку.
Написати програму, яка за натисканням кнопок додає рядки та стовпці до таблиці.


std {
width: 30px;
height: 10px;
border: 1px solid black;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE-edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="./style.css"/>
<title>Table</title>
</head>
<body>
<button id="add-row">Add row</button>
<button id="add-col">Add column</button>
<table>
<thead id="head">
<tr>
<td>Head</td>
</tr>
</thead>
<tbody id="body"></tbody>
<tfoot id="foot">
<tr>
<td>Foot</td>
</tr>
</tfoot>
</table>
<script src="/script.js"></script>
</body>
</html>
const head = document.getElementById("head");
const body = document.getElementById("body");
const foot = document.getElementById("foot");
const addRow = document.getElementById("add-row");
const addCol = document.getElementById("add-col");
const rows = [...Array.from(head.children), ...Array.from(foot.children)];
let colsCount = 1;
addRow.onclick = () => {
const tr = document.createElement("tr");
for (let i = 0; i < colsCount; i++) {
const td = document.createElement("td");
tr.append(td);
}
body.append(tr);
rows.push(tr);
};
addCol.onclick = () => {
for (const row of rows) {
const td = document.createElement("td");
row.append(td);
}
colsCount++;
};
Створимо дерево, яке на кліку на заголовок приховує-показує нащадків. Створимо таку сторінку:


Розмітка виглядає так:
<body>
<div>
<ul class="tree" id="tree">
<li>Живопись
<ul>
<li>Основные стили живописи
<ul>
<li>Ренессанс (Возрождение)</li>
<li>Авангардизм</li>
<li>Барокко</li>
<li>Классицизм</li>
<li>Романтизм</li>
<li>Импрессионизм</li>
<li>Экспрессионизм</li>
<li>Авангардизм</li>
</ul>
</li>
<li>Жанры живописи
<ul>
<li>портрет</li>
<li>пейзаж</li>
<li>натюрморт</li>
<li>исторический</li>
<li>батальный</li>
<li>анималистика</li>
<li>марина</li>
</ul>
</li>
</ul>
</li>
<li>Техники живописи
<ul>
<li>Масляная
<ul>
<li>многослойный</li>
<li>алла прима</li>
</ul>
</li>
<li>Другая
<ul>
<li>акварель</li>
<li>темпера</li>
<li>пастель</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
CSS виглядає так:
<style>
div {
background: #fce9c0; /* Цвет фона */
border: 2px solid #a9c35B; /* Параметры рамки */
padding: 10px; /* Поля */
width: 30%; /* Ширина */
box-sizing: border-box; /* Алгоритм расчёта ширины */
font-size: 14px; /* Размер шрифта */
color: navy;
}
.tree span:hover {
font-weight: bold;
color: darkred;
}
.tree span {
cursor: pointer;
}
</style>
Пишемо скрипт:
// поміщаємо текстові вузли в елемент
// він займає тільки те місце, яке необхідно для тексту
for (let li of tree.querySelectorAll('li')) {
let span = document.createElement('span');
li.prepend(span);
span.append(span.nextSibling); // поміщаємо текстовий вузол всередину елемента
}
// відловлюємо кліки по всьому дереву
tree.onclick = function(event) {
if (event.target.tagName != 'SPAN') {
return;
}
let childrenContainer = event.target.parentNode.querySelector('ul');
if (!childrenContainer) return; // немає дітей
childrenContainer.hidden = !childrenContainer.hidden;
}