For DOM trees which represent HTML documents, the returned tag name is always in the canonical upper-case form.
if(str.tagName == 'ul') {} else if (str.tagName == 'li') {str, что за странный выбор имени? Там же элемент, а не строка.elem.append('li');for (let el of strLi) { el.addEventListener('click',func); };
func вынесено за пределы текущей функции, иначе бы при каждом клике всем существующим li добавлялся новый обработчик.li, на свежесозданных li клик обрабатываться не будет (касается и тех, что изначально существуют).li - так зачем назначать отдельный обработчик клика? То, что делаете в func, вполне можно делать прямо тут.document.querySelector('ul').addEventListener('click', e => {
const t = e.target;
const ct = e.currentTarget;
t.insertAdjacentHTML('beforeend', ct === t ? '<li>text</li>' : '!');
}); if(str.tagName == 'UL') {
let li = document.createElement('li');
li.innerHTML = 'text';
elem.append('li');