Почему встроенный обработчик атрибутов является плохой идеей в современном семантическом HTML?
Являются ли встроенные обработчики событий плохой практикой?
Например: <button onclick=someFunction()>Click me!</button>
Если да, каковы недостатки использования встроенных обработчиков событий?
2 ответа
Это плохая идея, потому что...
1) В течение долгого времени существенный акцент делался на четкое разделение между содержанием, стилем и сценарием. Смешивание вашего HTML с JS не согласуется с этим.
2) Что еще более важно, вы получаете гораздо меньше контроля над своими событиями. В частности:
вы можете связать только одно событие каждого вида с событиями DOM-zero (что и есть встроенные события), поэтому вы не можете иметь два
click
обработчики событийесли событие указано встроенным, JS указывается в виде строки (значения атрибута всегда являются строками) и оценивается при возникновении события. Оценка это зло.
Вы столкнулись с необходимостью ссылаться на именованные функции. Это не всегда идеально (обработчики событий обычно принимают анонимные функции) и влияет на функцию, которая должна быть глобальной
Короче говоря, обрабатывать события централизованно через выделенный addEventListener
API, или через JQuery или что-то.
Помимо семантики и других мнений, выраженных в принятом ответе, все встроенные сценарии считаются уязвимостью и высокой угрозой безопасности. Предполагается, что любой веб-сайт, ожидающий запуска в современных браузерах, будет устанавливать свойство "Content-Security-Policy" (CSP) либо через метаатрибут, либо через заголовки.
Это несовместимо со всеми встроенными сценариями и стилями, если это явно не разрешено. Хотя цели CSP главным образом направлены на предотвращение постоянных угроз межсайтовых сценариев (xss), для которых встроенные сценарии и стили являются вектором xss, в настоящее время это поведение по умолчанию в браузерах, но может измениться в будущем.
Основываясь на ответе @Mitya.
В большинстве современных JS-библиотек React, Vue и т. Д. встроенные обработчики событий считаются идиоматическими, но большая часть ограничений, упомянутых @Mitya, исчезла. В качестве примера мы рассмотрим Vuejs и сравним его с пунктом, указанным выше:
- У вас может быть более одного обработчика событий, смотрите здесь
- Значения событий (обработчики), такие как
onclick
не являются простой строкой, а выражения js смотрите здесь - Проблема Global Scope просто не существует (потому что ваш код будет переведен в миниатюру, переупакован с помощью таких инструментов, как webpack или другие).
На мой взгляд, встроенный обработчик событий значительно улучшает читаемость, но мнения могут отличаться.