Прежде всего, вам следует перебрать все элементы li
DOM .
Вы можете сделать это, используя метод Array.from
в сочетании с forEach
, передав функцию обратного вызова , которая применяется для каждого элемента.
Затем проверьте, если data_total
больше 0, и если это правда, просто установите свойство className
для текущего элемента .
Кроме того, я создал функцию с именем checkIfChildsHaveMessages , которая проверяет, есть ли у элемента дочерние элементы, и содержит ли он хотя бы один элемент с new messages
.
function checkIfChildsHaveMessages(item){
let childrens = item.querySelectorAll('ul li');
if(childrens.length == 0)
return item.getAttribute('data-total') > 0;
return Array.from(childrens).some(ch => ch.getAttribute('data-total') > 0);
}
let li = document.getElementsByTagName('li');
Array.from(li).forEach(function(item){
data_total = item.getAttribute('data-total');
let childsHaveMessages = checkIfChildsHaveMessages(item);
if(data_total > 0 || childsHaveMessages)
item.className = "new_messages";
});
console.log(document.getElementsByTagName('ul')[0].innerHTML);
<ul>
<li data-total="0">Node 1</li>
<li data-total="4">Node 2</li>
<li data-total="0">Node 3
<ul>
<li data-total="0">sub node 1</li>
<li data-total="0">sub node 2
<ul>
<li data-total="0">test node 1</li>
<li data-total="2">test node 2</li>
<li data-total="7">test node 3</li>
</ul>
</li>
</ul>
</li>
<li data-total="0">Node 4</li>
</ul>
Токенизатор повреждает поток текста в маркеры, обычно путем поиска пробела (вкладки, пробелы, новые строки).
Лексический анализатор является в основном токенизатором, но он обычно присоединяет дополнительный контекст к маркерам - этот маркер является числом, тот маркер является строковым литералом, этот другой маркер является оператором равенства.
Синтаксический анализатор берет поток маркеров из лексического анализатора и превращает его в абстрактное синтаксическое дерево, представляющее (обычно) программа, представленная оригинальным текстом.
В последний раз я проверил, лучшей книгой по предмету были "Компиляторы: Принципы, Методы и Инструменты", обычно просто известные как "Книга Дракона".
Пример:
int x = 1;
Лексический анализатор или токенизатор разделят это на маркеры 'интервал', 'x', '=', '1', ';'.
Синтаксический анализатор будет брать те маркеры и использовать их для понимания в некотором роде:
Я сказал бы, что лексический анализатор и токенизатор являются в основном тем же самым, и что они разбивают текст в его составные части ('маркеры'). Синтаксический анализатор затем интерпретирует маркеры с помощью грамматики.
Я не стал бы слишком одержимым точным терминологическим использованием, хотя - люди часто используют 'парсинг' для описания любого действия интерпретации глыбы текста.