\n```\n\nПроблемы этого подхода:\n- Смешивает HTML и JavaScript\n- Сложнее отладить\n- Нельзя добавить несколько обработчиков\n- Плохо для безопасности (XSS уязвимости)\n- Не работает с event bubbling контролем\n\n## Способ 2: onclick как свойство элемента\n\nЛучше, чем HTML атрибут, но всё ещё устаревает:\n\n```javascript\n// Получаем элемент\nconst button = document.getElementById('myButton');\n\n// Назначаем обработчик\nbutton.onclick = function(event) {\n console.log('Нажата кнопка!');\n console.log('Event объект:', event);\n};\n\n// Или используя стрелочную функцию\nbutton.onclick = (event) => {\n console.log('Клик обработан');\n};\n```\n\nПроблемы:\n- Можно назначить только одного обработчика\n- Если назначить второго, первый перепишется\n\n```javascript\nbutton.onclick = () => console.log('Первый');\nbutton.onclick = () => console.log('Второй'); // Первый перепишется!\n\n// Выведет только: Второй\n```\n\n## Способ 3: addEventListener (рекомендуется)\n\nМодерный и правильный способ:\n\n```javascript\nconst button = document.getElementById('myButton');\n\n// Добавляем обработчик\nbutton.addEventListener('click', function(event) {\n console.log('Кнопка нажата!');\n console.log('Event:', event);\n});\n\n// Можно добавить несколько обработчиков\nbutton.addEventListener('click', () => {\n console.log('Первый обработчик');\n});\n\nbutton.addEventListener('click', () => {\n console.log('Второй обработчик');\n});\n\n// Оба выполнятся: Первый обработчик, Второй обработчик\n```\n\n## Event объект при клике\n\nПри возникновении события click создаётся объект события:\n\n```javascript\nbutton.addEventListener('click', (event) => {\n // event - это MouseEvent объект\n \n console.log(event.type); // \"click\"\n console.log(event.target); // Элемент, на котором произошёл клик\n console.log(event.clientX); // X координата мыши\n console.log(event.clientY); // Y координата мыши\n console.log(event.button); // 0 = левая кнопка, 1 = средняя, 2 = правая\n console.log(event.ctrlKey); // true если нажата Ctrl\n console.log(event.shiftKey); // true если нажата Shift\n console.log(event.altKey); // true если нажата Alt\n console.log(event.timeStamp); // Когда произошёл клик\n});\n```\n\n## Практические примеры\n\n**1. Простой клик с обработкой:**\n\n```javascript\nconst button = document.querySelector('button');\n\nbutton.addEventListener('click', (event) => {\n console.log('Вы кликнули!');\n event.target.style.backgroundColor = 'blue';\n});\n```\n\n**2. Обработка кликов с фильтром:**\n\n```javascript\n// Клик только левой кнопкой мыши\nbutton.addEventListener('click', (event) => {\n if (event.button === 0) {\n console.log('Левая кнопка');\n }\n});\n\n// Клик с Shift\nbutton.addEventListener('click', (event) => {\n if (event.shiftKey) {\n console.log('Shift + клик');\n }\n});\n```\n\n**3. Удаление обработчика:**\n\n```javascript\nconst handleClick = (event) => {\n console.log('Кнопка нажата');\n};\n\n// Добавляем\nbutton.addEventListener('click', handleClick);\n\n// Удаляем\nbutton.removeEventListener('click', handleClick);\n```\n\n**4. Остановка распространения события:**\n\n```javascript\nbutton.addEventListener('click', (event) => {\n event.stopPropagation(); // Событие не поднимется к родителю\n event.preventDefault(); // Отменяет стандартное поведение\n console.log('Клик обработан, но не распространяется выше');\n});\n```\n\n## onclick в React (правильно)\n\nВ React не используют onclick атрибут, вместо этого используют onClick prop:\n\n```javascript\nimport { useState } from 'react';\n\nfunction MyButton() {\n const [count, setCount] = useState(0);\n \n const handleClick = () => {\n setCount(count + 1);\n };\n \n return (\n \n );\n}\n\n// Или инлайн\nfunction Counter() {\n return (\n \n );\n}\n```\n\n## Различия между способами\n\n| Способ | Одиночный | Множественный | Удаление | Рекомендуемо |\n|--------|-----------|--------------|----------|----------|\n| HTML onclick | Да | Нет | Нет | Нет |\n| onclick свойство | Да | Нет | Да | Нет |\n| addEventListener | Да | Да | Да | Да |\n\n## Важные моменты\n\n1. **Порядок выполнения** - обработчики выполняются в порядке добавления\n2. **Event delegation** - клики на дочерних элементах всплывают к родителям\n3. **this в обработчике** - зависит от типа функции (обычная vs стрелочная)\n4. **Память** - не забывайте удалять обработчики при unmount компонентов\n5. **Производительность** - 1000+ обработчиков = медленнее, лучше использовать event delegation\n\nЗапомни: **addEventListener - правильный способ обработки кликов в современном JavaScript. Используй onclick только если работаешь с очень старым кодом.**","dateCreated":"2026-04-03T17:55:07.540535","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Как работает onclick в JavaScript?

2.0 Middle🔥 181 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое onclick

onclick - это атрибут и свойство в JavaScript, которое позволяет назначить функцию, выполняемую при клике пользователя на элемент. Это один из способов обработки события "click".

В JavaScript существует три способа обработки кликов:

  1. Атрибут onclick в HTML
  2. Свойство onclick объекта элемента
  3. Метод addEventListener (рекомендуется)

Способ 1: onclick в HTML атрибуте

Самый старый и НЕ рекомендуемый способ:

<button onclick="handleClick()">Нажми меня</button>

<script>
  function handleClick() {
    console.log('Кнопка была нажата!');
  }
</script>

Проблемы этого подхода:

  • Смешивает HTML и JavaScript
  • Сложнее отладить
  • Нельзя добавить несколько обработчиков
  • Плохо для безопасности (XSS уязвимости)
  • Не работает с event bubbling контролем

Способ 2: onclick как свойство элемента

Лучше, чем HTML атрибут, но всё ещё устаревает:

// Получаем элемент
const button = document.getElementById('myButton');

// Назначаем обработчик
button.onclick = function(event) {
  console.log('Нажата кнопка!');
  console.log('Event объект:', event);
};

// Или используя стрелочную функцию
button.onclick = (event) => {
  console.log('Клик обработан');
};

Проблемы:

  • Можно назначить только одного обработчика
  • Если назначить второго, первый перепишется
button.onclick = () => console.log('Первый');
button.onclick = () => console.log('Второй'); // Первый перепишется!

// Выведет только: Второй

Способ 3: addEventListener (рекомендуется)

Модерный и правильный способ:

const button = document.getElementById('myButton');

// Добавляем обработчик
button.addEventListener('click', function(event) {
  console.log('Кнопка нажата!');
  console.log('Event:', event);
});

// Можно добавить несколько обработчиков
button.addEventListener('click', () => {
  console.log('Первый обработчик');
});

button.addEventListener('click', () => {
  console.log('Второй обработчик');
});

// Оба выполнятся: Первый обработчик, Второй обработчик

Event объект при клике

При возникновении события click создаётся объект события:

button.addEventListener('click', (event) => {
  // event - это MouseEvent объект
  
  console.log(event.type);           // "click"
  console.log(event.target);         // Элемент, на котором произошёл клик
  console.log(event.clientX);        // X координата мыши
  console.log(event.clientY);        // Y координата мыши
  console.log(event.button);         // 0 = левая кнопка, 1 = средняя, 2 = правая
  console.log(event.ctrlKey);        // true если нажата Ctrl
  console.log(event.shiftKey);       // true если нажата Shift
  console.log(event.altKey);         // true если нажата Alt
  console.log(event.timeStamp);      // Когда произошёл клик
});

Практические примеры

1. Простой клик с обработкой:

const button = document.querySelector('button');

button.addEventListener('click', (event) => {
  console.log('Вы кликнули!');
  event.target.style.backgroundColor = 'blue';
});

2. Обработка кликов с фильтром:

// Клик только левой кнопкой мыши
button.addEventListener('click', (event) => {
  if (event.button === 0) {
    console.log('Левая кнопка');
  }
});

// Клик с Shift
button.addEventListener('click', (event) => {
  if (event.shiftKey) {
    console.log('Shift + клик');
  }
});

3. Удаление обработчика:

const handleClick = (event) => {
  console.log('Кнопка нажата');
};

// Добавляем
button.addEventListener('click', handleClick);

// Удаляем
button.removeEventListener('click', handleClick);

4. Остановка распространения события:

button.addEventListener('click', (event) => {
  event.stopPropagation(); // Событие не поднимется к родителю
  event.preventDefault();  // Отменяет стандартное поведение
  console.log('Клик обработан, но не распространяется выше');
});

onclick в React (правильно)

В React не используют onclick атрибут, вместо этого используют onClick prop:

import { useState } from 'react';

function MyButton() {
  const [count, setCount] = useState(0);
  
  const handleClick = () => {
    setCount(count + 1);
  };
  
  return (
    <button onClick={handleClick}>
      Нажимали {count} раз
    </button>
  );
}

// Или инлайн
function Counter() {
  return (
    <button onClick={(event) => {
      console.log('Event:', event);
      console.log('Кнопка нажата');
    }}>
      Клик
    </button>
  );
}

Различия между способами

СпособОдиночныйМножественныйУдалениеРекомендуемо
HTML onclickДаНетНетНет
onclick свойствоДаНетДаНет
addEventListenerДаДаДаДа

Важные моменты

  1. Порядок выполнения - обработчики выполняются в порядке добавления
  2. Event delegation - клики на дочерних элементах всплывают к родителям
  3. this в обработчике - зависит от типа функции (обычная vs стрелочная)
  4. Память - не забывайте удалять обработчики при unmount компонентов
  5. Производительность - 1000+ обработчиков = медленнее, лучше использовать event delegation

Запомни: addEventListener - правильный способ обработки кликов в современном JavaScript. Используй onclick только если работаешь с очень старым кодом.