Задать вопрос
@Swaer

Как лучше организовать код и вообще улучшить код?

let resa = document.querySelector('.todo_ul');
let addLi = document.querySelector('.todo_add');
let inputLi = document.querySelector('.todo_input');

// Событие на кнопку "Добавить"
addLi.addEventListener('click',function(e){
  //Отключает перезагрузку страниц
  e.preventDefault();
  let ul = document.querySelector('.todo_ul');
  //В список при нажатии на кнопку "Добавить" добавляется новый элемент списка со значением из инпута
  ul.appendChild(addNewLi(inputLi.value))
  //Очищаем инпут
  inputLi.value = '';
});
//Функция для создания элемента списка
function addNewLi(value){
  if(value === ''){
    return false
  };
  //Создаем элемент списка
  let li = document.createElement('li');
  //Добавляем ему класс
  li.className = 'todo_li';
  //Создаем кнопку 'Check'
  let divInLi = document.createElement('div');
  //Добавляем кнопке класс
  divInLi.className = 'todo_check';
  //Создаем кнопку "Изменить" для изменения значения элемента списка
  let changeButton = document.createElement('input');
  //Добавляем кнопке "Изменить" атрибуты
  changeButton.setAttribute('type','button');
  changeButton.setAttribute('value','Изменить');
  //Добавляем кнопке "Изменить" классы
  changeButton.className = 'todo_li_change li_button';
  //Создаем кнопку "Удалить" для удаления элемента списка
  let deleteButton = document.createElement('input');
  //Добавляем кнопке "Удалить" атрибуты
  deleteButton.setAttribute('type','button');
  deleteButton.setAttribute('value','Удалить');
  //Добавляем кнопке "Удалить" классы
  deleteButton.className = 'todo_li_delete li_button';
  //Создаем кнопку "Сохранить" для сохранения измененого значения в элемент списка
  let saveButton = document.createElement('input');
  //Добавляем кнопке "Удалить" атрибуты
  saveButton.setAttribute('type','button');
  saveButton.setAttribute('value','Сохранить');
  //Добавляем кнопке "Удалить" классы
  saveButton.className = 'save_change_item li_button';
  //Создаем поле для изменения значения элемента списка
  let saveInput = document.createElement('input');
  //Добавляем полю атрибуты
  saveInput.setAttribute('type','text');
  //Добавляем полю классы
  saveInput.className += 'change_item';
  //Создаем текстовое поле, куда будет записанно значение элемента списка
  let p = document.createElement('p');
  //Добавляем полю класс
  p.className = 'li_text';
  //В него записываем значение параметра
  p.innerHTML = value;
  //Все созданные элементы добавлчем в новый элемент списка
  li.appendChild(p);
  li.appendChild(divInLi);
  li.appendChild(changeButton);
  li.appendChild(deleteButton);
  li.appendChild(saveButton);
  li.appendChild(saveInput);
  //Выполняить функцию, а качестве аргумента - нвоый созданый элемент списка
  doEvent(li);
  
  return li
};
//функция для создания событий на элементы внутри элемента списка
function doEvent(toDoItem){
  let toDoLi = toDoItem.querySelector('.todo_check');
  let changeButton = toDoItem.querySelector('.todo_li_change');
  let deleteButton = toDoItem.querySelector('.todo_li_delete');
  let saveButton = toDoItem.querySelector('.save_change_item');
   saveButton.addEventListener('click',saveItem);
   toDoItem.addEventListener('click',changeItem);
   toDoItem.addEventListener('mouseout',itemHidden);
   toDoItem.addEventListener('mouseover',itemShow);
   toDoLi.addEventListener('click',checkBox);
   changeButton.addEventListener('click',changeBox);
   deleteButton.addEventListener('click',deleteBox);
}
//При нажатии на кнопку "Check" добавляем или удаляет класс кнопке "Check" и элементу списка
function checkBox(){
  this.classList.toggle('check');
  this.parentNode.classList.toggle('checked')
}
//При нажатии на элемент списка или его текст добавляем или удаляет класс кнопке "Check" и элементу списка
function changeItem(e) {
  if(e.target.nodeName == 'LI'){
    let check = e.target.querySelector('.todo_check');
    e.target.classList.toggle('checked');
    check.classList.toggle('check');
  }else if(e.target.nodeName == 'P'){
    let check = e.target.parentNode.querySelector('.todo_check');
    e.target.parentNode.classList.toggle('checked');
    check.classList.toggle('check');
  }
}
//При нажатии на кнопку "Измнеить", будут показаны поле ввода со значением из элемента списка и кнопка "Сохранить", для изменения значения элемента списка и его сохранения, кнопки "Изменить" "Удалить" будут скрыты
function changeBox(){
  let save = this.parentNode.querySelector('.save_change_item');
  let saveInput = this.parentNode.querySelector('.change_item');
  let deleteButton = this.parentNode.querySelector('.todo_li_delete');
  let litext = this.parentNode.querySelector('.li_text'); 
  saveInput.value = litext.innerHTML;
  save.style.visibility = 'visible';
  saveInput.style.visibility = 'visible';
  this.className += ' disp_none';
  deleteButton.className += ' disp_none';
}
//При нажатии на кнопку "Сохранить", значение поля ввода будет сохранено в значение элемента списка, поле ввода и кнопка "Сохранить" будут скрыты, кнопки "Изменить" "Удалить" будут снова видны
function saveItem(){
  let saveInput = this.parentNode.querySelector('.change_item'); 
  let litext = this.parentNode.querySelector('.li_text'); 
  litext.innerText = saveInput.value;
  let save = this.parentNode.querySelector('.save_change_item');
  let deleteButton = this.parentNode.querySelector('.todo_li_delete');
  let chandeButton = this.parentNode.querySelector('.todo_li_change');
  save.style.visibility = 'hidden';
  saveInput.style.visibility = 'hidden';
  deleteButton.classList.remove('disp_none')
  chandeButton.classList.remove('disp_none')
}
//Удаление элемента списка при нажатии на кнопку "Удалить"
function deleteBox(){
  this.parentNode.remove()
}
//При наведении на элемент списка будут показаны кнопки "Изменить" "Удалить"
function itemShow(){
  this.querySelector('.todo_li_change').style.visibility = 'visible';
  this.querySelector('.todo_li_delete').style.visibility = 'visible';
}
// При выходе курсора с элемента списка кнопки "Изменить" "Удалить" будут скрыты
function itemHidden(){
  this.querySelector('.todo_li_change').style.visibility = 'hidden';
  this.querySelector('.todo_li_delete').style.visibility = 'hidden';
}

Код моей тудушки, думаю у меня серьезные проблемы с созданием красиво и читабельного кода, хотел бы к вам обратиться, чтобы помогли с этим, код как надо работает
  • Вопрос задан
  • 124 просмотра
Подписаться 2 Простой 2 комментария
Решения вопроса 1
@forspamonly2
как я понимаю, вы именно на ванильном жабаскрипте пытаетесь, поэтому библиотеки и фреймворки советовать не буду.

новый элемент списка я бы вам советовал всё равно сделать в виде шаблона, хотя бы простого жабаскриптовского многострочного литерала. вот текст самой тудушки в нём лучше скриптом прописать в innerText, чтобы не эскейпить руками.

вместо того, чтобы на каждую созданную тудушку цеплять все обработчики событий, лучше обработку делегировать - повесить их один раз на сам список. а то, какую кнопку какой конкретно тудушки кликали, общий обработчик может выяснить по event.target.

кнопки "Изменить" "Удалить" лучше показывать не скриптом, а цсс.

ну и самое главное, вы фактически модель данных держите прямо в хтмл элементах. это приемлемо работает только на примитивных примерах, вроде вашего. в большинстве реальных случаев куда проще иметь разделение на модель данных, которыми оперирует скрипт, и их отображение в виде хтмл. почитайте про паттерн model-view-controller.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы