Javascript имеет тенденцию смешивать все в объекты, и это может сбить с толку.Все в одном - это способ JavaScript.
По сути, onclick - это атрибут HTML.И наоборот, addEventListener - это метод объекта DOM, представляющего элемент HTML.
В объектах JavaScript метод - это просто свойство, которое имеет функцию в качестве значения и работает с объектом, к которому она присоединена (используянапример).
В JavaScript в качестве HTML-элемента, представленного DOM, его атрибуты будут сопоставлены с его свойствами.
Здесь люди запутываются, потому что JavaScript объединяет все в один контейнер или пространство имен с помощьюнет слоя косвенности.
В обычной компоновке OO (которая, по крайней мере, объединяет пространство имен свойств / методов), вы могли бы иметь что-то вроде:
domElement.addEventListener // Object(Method)
domElement.attributes.onload // Object(Property(Object(Property(String))))
Есть варианты, подобные этомуможно использовать метод получения / установки для onload или HashMap для атрибутов, но в конечном итоге это будет выглядеть так.JavaScript устранил этот слой косвенности в ожидании знания того, что есть что среди прочего.Он объединил domElement и атрибуты воедино.
Запрет совместимости, которую вы должны в качестве лучшей практики использовать addEventListener.Поскольку другие ответы говорят о различиях в этом отношении, а не о фундаментальных программных различиях, я воздержусь от этого.По сути, в идеальном мире вы действительно должны использовать только * из HTML, но в еще более идеальном мире вы не должны делать ничего подобного из HTML.
Почему это доминирует сегодня?Его легче писать, легче изучать и он просто работает.
Весь смысл загрузки в HTML заключается в том, чтобы в первую очередь предоставить доступ к методу или функциональности addEventListener.Используя его в JS, вы просматриваете HTML, когда можете применять его напрямую.
Гипотетически вы можете создавать свои собственные атрибуты:
$('[myclick]').each(function(i, v) {
v.addEventListener('click', function() {
eval(v.myclick); // eval($(v).attr('myclick'));
});
});
То, что делает JS, немного отличаетсяк этому.
Вы можете приравнять его к чему-то вроде (для каждого созданного элемента):
element.addEventListener('click', function() {
switch(typeof element.onclick) {
case 'string':eval(element.onclick);break;
case 'function':element.onclick();break;
}
});
Фактические детали реализации, скорее всего, будут отличаться с диапазоном тонких изменений, делая два слегка отличающихсяв некоторых случаях, но это суть.
Возможно, это хак совместимости, который вы можете прикрепить функцию к атрибуту on, поскольку по умолчанию все атрибуты являются строками.