Редакция
Ненавязчивый JavaScript подход был хорошим в PAST - особенно привязка обработчиков событий в HTML считалась плохой практикой (в основном потому, что onclick events run in the global scope and may cause unexpected error
то, что упоминалось Минхуаном)
Однако ...
В настоящее время кажется, что этот подход немного устарел и нуждается в некотором обновлении.Если кто-то хочет стать профессиональным разработчиком внешнего интерфейса и писать большие и сложные приложения, ему нужно использовать такие фреймворки, как Angular, Vue.js и т. Д. Однако эти фреймворки обычно используют (или позволяют использовать) HTML-шаблоны где обработчики событий привязываются непосредственно к коду html-шаблона, и это очень удобно, понятно и эффективно - например, в угловом шаблоне обычно пишут:
<button (click)="someAction()">Click Me</button>
В необработанном js / html эквивалентом этого будет
<button onclick="someAction()">Click Me</button>
Разница в том, что в raw js onclick
событие запускается в глобальной области видимости - но платформы обеспечивают инкапсуляцию.
Так в чем же проблема?
Проблема в том, что начинающий программист, который всегда слышал, что html-onclick является плохим и кто всегда использует btn.addEventListener("onclick", ... )
, хочет использовать какую-то инфраструктуру с шаблонами (addEventListener
также имеет недостатков - если мы обновляем DOM в динамическом режимеЕсли использовать innerHTML=
- что быстрее, чем appendChild
тесты здесь - тогда мы теряем привязку обработчиков событий таким образом).Тогда он столкнется с чем-то вроде вредных привычек или неправильного подхода к использованию фреймворка - и он будет очень плохо использовать фреймворк - потому что он сосредоточится в основном на js-части, а не на шаблонной части (и будет производить неясные и сложные в обслуживаниикод).Чтобы изменить эти привычки, он потеряет много времени (и, вероятно, ему понадобится немного удачи и учителя).
Так что, на мой взгляд, исходя из опыта моих учеников, было бы лучше для них, если бы они использовали html-хендлеры-связывают в начале.Как я уже сказал, это правда, что обработчики вызываются в глобальной области, но на этом этапе студенты обычно создают небольшие приложения, которыми легко управлять.Для написания больших приложений они выбирают несколько фреймворков.
Так что же делать?
Мы можем ОБНОВИТЬ ненавязчивый подход JavaScript и разрешить связывать обработчики событий (в конечном итоге с простыми параметрами) в html (но только связыватьобработчик - не вводить логику в клик, как в операционном вопросе).Так что по моему мнению в сыром 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>
Реальность меняется, наша точка зрения тоже должна