Удаление указанной строки таблицы c из локального хранилища при нажатии кнопки удаления - PullRequest
0 голосов
/ 19 апреля 2020

Я довольно новичок в программировании (всего несколько недель) и пытался сделать небольшой тренировочный проект, где вы можете создавать шутки, а затем хранить их в местном хранилище вместе с вашим именем и возрастом. Справа есть мусорное ведро, где вы можете удалить шутку.

Вы можете посмотреть сайт здесь: https://nostalgic-poitras-17b692.netlify.app/

Здесь вы можете найти файлы: https://github.com/Dannus90/JavaScript_Practise_Own_Project_Unfinished

Таким образом, вы можете ввести все, и он определяет, если вы вошли или нет. Затем шутка сохраняется в локальном хранилище и отображается на экране в таблице.

На данный момент есть две проблемы: - Если я нажму любую тра sh, может ли она удалить все строки из локального хранилища, и я знаю, почему это происходит в коде, но я Не знаю, как нацелить строку спецификатора, и удалить эту строку из локального хранилища только при нажатии кнопки tra sh.

  • Вторая проблема заключается в том, что когда я делал 2 шутки, а затем обновлял страницу. Они все еще там, так что все работает. Однако, если я затем после refre sh введу новые шутки, они перезапишут старое локальное хранилище вместо того, чтобы добавить к нему, поэтому, если я снова refre sh, только последние шутки будут показаны.

Проблемы должны быть найдены на следующих рисунках: Проблема1 Задача2

Это мой код, поэтому faar (В документах от GitHub вы также видите генератор случайных идентификаторов. Забрал его, чтобы уменьшить путаницу :-)):

// Variables

const jokeInput = document.getElementById("text-1");
const nameInput = document.getElementById("text-2");
const ageInput = document.getElementById("number");
const submitBtn = document.querySelector(".btn");
const output = document.querySelector(".output-container");

// Eventlisteners
submitBtn.addEventListener("click", validateFields);

// Error
function showError(input) {
  const formControl = input;
  formControl.style.border = "3px solid red";

  removeStyle(formControl);
}

// Show Error message
function showErrorMessage(input, message) {
  input.classList.add("error");
  input.innerText = message;
  setTimeout(() => {
    input.classList.remove("error");
  }, 3000);
}

// Show success
function showSuccess() {
  jokeInput.style.border = "3px solid green";
  nameInput.style.border = "3px solid green";
  ageInput.style.border = "3px solid green";

  const small = document.querySelector(".small-3");

  small.classList.add("success");
  small.innerText = "You have successfully entered all fields";
  setTimeout(() => {
    small.classList.remove("success");
  }, 3000);

  removeStyle(jokeInput, nameInput, ageInput);
}

// Remove Style
function removeStyle(input, input2, input3) {
  setTimeout(() => {
    input.style.removeProperty("border");
    input2.style.removeProperty("border");
    input3.style.removeProperty("border");
  }, 3000);
}

// Main Function
function validateFields(e) {
  e.preventDefault();

  if (jokeInput.value === "") {
    showError(jokeInput);
    const small = document.querySelector(".small-1");
    showErrorMessage(small, "Please provide a joke");
  }

  if (nameInput.value === "") {
    showError(nameInput);
    const small = document.querySelector(".small-2");
    showErrorMessage(
      small,
      "Please fill in your name with alpabetical characters only"
    );
  }

  if (ageInput.value === "") {
    showError(ageInput);
    const small = document.querySelector(".small-3");
    showErrorMessage(small, "Please enter your age");
  }

  if (
    jokeInput.value !== "" &&
    nameInput.value !== "" &&
    ageInput.value !== ""
  ) {
    showSuccess();
    updateDOM(jokeInput.value, nameInput.value, ageInput.value);
  }
}

// Save DOM Data
let savedLocalStorage1 = [];
let savedLocalStorage2 = [];
let savedLocalStorage3 = [];
let savedLocalStorage4 = [];

// Update local storage

function updateLocalStorage() {
  localStorage.setItem(
    "savedLocalStorage1",
    JSON.stringify(savedLocalStorage1)
  );
  localStorage.setItem(
    "savedLocalStorage2",
    JSON.stringify(savedLocalStorage2)
  );
  localStorage.setItem(
    "savedLocalStorage3",
    JSON.stringify(savedLocalStorage3)
  );
  localStorage.setItem(
    "savedLocalStorage4",
    JSON.stringify(savedLocalStorage4)
  );
}

// Update DOM
function updateDOM(input1, input2, input3) {
  const outputContainer = document.querySelector(".output-container");

  const row = outputContainer.insertRow(1);
  const cell1 = row.insertCell(0);
  const cell2 = row.insertCell(1);
  const cell3 = row.insertCell(2);
  const cell4 = row.insertCell(3);

  cell1.innerHTML = `${input1}`;
  cell2.innerHTML = `${input2}`;
  cell3.innerHTML = `${input3}`;
  cell4.innerHTML = `<i class="fas fa-trash-alt id4"></i>`;

  savedLocalStorage1.push({ id: uuidv4(), cell_1: `${input1}` });
  savedLocalStorage2.push({ id: uuidv4(), cell_2: `${input2}` });
  savedLocalStorage3.push({ id: uuidv4(), cell_3: `${input3}` });
  savedLocalStorage4.push({
    id: uuidv4(),
    cell_4: `<i class="fas fa-trash-alt id4"></i>`,
  });

  updateLocalStorage();

  const rows = document.querySelectorAll("tr");
  if (rows.length > 2) {
    resetBounce();
  }
}

window.onload = (e) => {
  function DOMOutput() {
    const sto1 = JSON.parse(localStorage.getItem("savedLocalStorage1"));
    const sto2 = JSON.parse(localStorage.getItem("savedLocalStorage2"));
    const sto3 = JSON.parse(localStorage.getItem("savedLocalStorage3"));
    const sto4 = JSON.parse(localStorage.getItem("savedLocalStorage4"));

    const outputContainer = document.querySelector(".output-container");

    for (let i = 0; i < sto1.length; i++) {
      const row = outputContainer.insertRow(1);

      const cell1 = row.insertCell(0);
      cell1.innerHTML = sto1[i].cell_1;

      const cell2 = row.insertCell(1);
      cell2.innerHTML = sto2[i].cell_2;

      const cell3 = row.insertCell(2);
      cell3.innerHTML = sto3[i].cell_3;

      const cell4 = row.insertCell(3);
      cell4.innerHTML = sto4[i].cell_4;

    }
  }

  DOMOutput();
};

// Delete from local Storage

// Reset bounce function
function resetBounce() {
  setTimeout(() => {
    const cell4 = document.querySelectorAll(".fas");
    cell4.forEach((element) => element.classList.remove("fas", "fa-trash-alt"));
  }, 50);

  setTimeout(() => {
    const cell4 = document.querySelectorAll(".id4");
    console.log(cell4);
    cell4.forEach((element) => element.classList.add("fas", "fa-trash-alt"));
  }, 75);
}

// Delete Function
output.addEventListener("click", function clearRow(e) {
  if (e.target.className.includes("fas")) {
    e.target.parentElement.parentElement.remove();

    // Needs to be fixed!

    localStorage.removeItem("savedLocalStorage1");
    localStorage.removeItem("savedLocalStorage2");
    localStorage.removeItem("savedLocalStorage3");
    localStorage.removeItem("savedLocalStorage4");
  }
});

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Спасибо за помощь!

Это не сработало полностью, но дало мне правильное представление о том, что делать. Сначала я установил sto для глобальных переменных, как вы сказали, но я не смог использовать спред на saveLocalStorage, он дал мне следующее сообщение: введите описание изображения здесь

Также начали прыгать мусорные баки несинхронно c.

Не уверен, почему это не сработало, как задумано, потому что я думаю, что решение выглядело хорошо. Может быть, длина saveLocalStorage не может быть нулевой с первого раза, когда я сохранял ее только в sto1, sto2, sto3, sto4 при загрузке окна.

Я использовал вместо этого оператор распространения, а затем он, кажется, работал (также инициализировал sto1-2-3-4 также как пустые массивы - это тоже могло быть проблемой): Работа

0 голосов
/ 19 апреля 2020

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

Первым шагом было бы объявление let sto1, sto2, sto3, sto4; в качестве глобальных переменных, чтобы каждый из ваши функции всегда имеют к нему доступ. Вы заполняете эти переменные в своей функции onload, в основном так же, как и раньше, вам нужно только удалить ключевое слово const перед ними.

Когда вы добавляете новый элемент в локальное хранилище, вы получаете доступ к Глобальная хранимая переменная и используйте оператор для добавления всех старых элементов во вновь созданный массив:

 savedLocalStorage1 = [...sto1, { id: uuidv4(), cell_1: `${input1}` }];
  savedLocalStorage2 = [...sto2, { id: uuidv4(), cell_2: `${input2}` }];
  savedLocalStorage3 = [...sto3, { id: uuidv4(), cell_3: `${input3}` }];
  savedLocalStorage4 = [
    ...sto4,
    {
      id: uuidv4(),
      cell_4: `<i class="fas fa-trash-alt id4"></i>`
    }
  ];

Для удаления элемента вы в основном делаете то же самое, но вам необходимо удалите элемент, который вам больше не нужен, возможно, с помощью функции фильтра (сделайте это самостоятельно на практике, спросите, нужна ли вам подсказка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...