Перегляд
Ненав'язливий підхід JavaScript був хорошим у минулому - особливо посилання обробника подій у HTML вважалося поганою практикою (головним чином через onclick events run in the global scope and may cause unexpected error
те, що згадували YiddishNinja )
Однак ...
Наразі здається, що такий підхід трохи застарів і потребує певного оновлення. Якщо хтось хоче бути професійним розробником frontend та писати великі та складні додатки, тоді йому потрібно використовувати рамки, такі як Angular, Vue.js, тощо. Однак ці рамки зазвичай використовують (або дозволяють використовувати) HTML-шаблони, де пов'язують обробники подій в коді HTML-шаблону безпосередньо, і це дуже зручно, зрозуміло та ефективно - наприклад, у кутовому шаблоні люди зазвичай пишуть:
<button (click)="someAction()">Click Me</button>
У raw js / html еквівалент цього буде
<button onclick="someAction()">Click Me</button>
Різниця полягає в тому, що в сирому js onclick
подія запускається в глобальному масштабі - але рамки забезпечують інкапсуляцію.
То де проблема?
Проблема полягає в тому, коли початківець програміст, який завжди чув, що html-onclick поганий, і який завжди використовує, btn.addEventListener("onclick", ... )
хоче використовувати якусь рамку з шаблонами ( addEventListener
також є недоліки - якщо ми оновимо DOM динамічним способом за допомогою innerHTML=
(що досить швидко ) - тоді ми втрачаємо події обробники пов'язуються таким чином). Тоді він зіткнеться з чимось на зразок шкідливих звичок або неправильного підходу до використання фреймворку - і він буде використовувати рамки дуже погано - тому що він зосередиться в основному на js-частині, а не на частині шаблону (а також створює незрозумілі та важкі в обслуговуванні код). Щоб змінити ці звички, він втратить багато часу (і, ймовірно, йому знадобиться трохи удачі та вчителя).
Тож, на мою думку, виходячи з досвіду роботи з моїми студентами, краще було б для них, якщо вони використовують html-обробники-прив'язки на початку. Як я кажу, це правда, що обробники телефонують у глобальному масштабі, але на цьому етапі студенти зазвичай створюють невеликі програми, які легко контролювати. Для написання великих додатків вони вибирають деякі рамки.
То що робити?
Ми можемо ОБНОВЛИТИ ненав’язливий підхід JavaScript і дозволити зв'язувати обробники подій (зрештою, з простими параметрами) в html (але тільки прив'язувати обробник - не вводити логіку в onclick, як в ОП питання). Тож, на мою думку, у raw js / html це має бути дозволено
<button onclick="someAction(3)">Click Me</button>
або
function popup(num,str,event) {
let re=new RegExp(str);
// ...
event.preventDefault();
console.log("link was clicked");
}
<a href="https://example.com" onclick="popup(300,'map',event)">link</a>
Але нижче прикладів НЕ слід допускати
<button onclick="console.log('xx'); someAction(); return true">Click Me</button>
<a href="#" onclick="popup('/map/', 300, 300, 'map'); return false;">link</a>
Реальність змінюється, і наша точка зору повинна