переписал
код на чистый js
на кроссбраузрность не претендую, написан на ECMAScript 2015
в приложении этом есть недостатки, использовать его в реальной работе нельзя:
- постоянно обновляется весь DOM, этого делать нельзя, если удалили строку то обновить нужно только эту строку (и т. д.);
- обработчики навешиваются на DOM элементы, а работа по сути ведется с массивом данных, такой подход нужно реализовывать в совокупности с фреймворками (vue, riot, react и т.д.) изменил данные, рендер html отдать на откуп шаблонизатору фреймворка, он уже определит, что обновить;
- если уж использовать DOM, то от массива данных и вовсе можно отказаться, добавил строку, так и генерить новый элемент и добавлять его в DOM.
Ошибки по коду:
- использовать $(tasks).each для перебора массива это слишком, нужно использовать
циклы, или
методы работы с массивом;
- переменные объявлять вверху функции, например let i = 0, j = 1, k = 1; далее тело функции, так код проще читать;
- переменную стоит объявлять если она используется более одного раза;
- вместо $('#todo-list').find('li').remove(); $('#todo-list li').remove();
- вот так tasks[id] идет обращение к массиву данных по номеру элемента, но id не равен порядковому номеру элемента;
- tasks.splice(id, 1); аналогичная ошибка, по индексу удалиться случайный элемент а не по нужному id;
- $('#clear-completed').on('click', function () далее ерунда написана, удаляется DOM, потом удаляются данные, а потом заново все отрисовывается, в данном случае удаление DOM $('input:checked').parents('li').remove(); излишне;
- если уж использовать jQuery то dataset заменить на .data();
Как совет, прочитайте как работать с нативным js: переменные, массивы, объекты, функции, потом уже работа с DOM, а потом только посмотрите методы в jQuery, в голове сложится какая-то картина как устроен web frontend