Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Função para editar o texto de um item

Fui um pouco além do projeto proposto pelo professor. Queria ter um jeito de editar o texto de um item. Vai que por um acaso você escreve errado uma palavra. Ao invés de excluir esse item para acrescentá-lo de novo, fiz um jeito de poder editá-lo.

Primeiro tive que envolver o texto do item num <span class="texto-item">. Depois alterei a função criaElemento() da seguinte forma:

function criaElemento(item) {  
    if (item.quantidade == ''){
        item.quantidade = 1;
    };
    
    const numItem = document.createElement('strong');
    numItem.innerHTML = item.quantidade;
    numItem.dataset.id = item.id;
    
    const novoItem = document.createElement('li');
    novoItem.classList.add("item");
    novoItem.appendChild(numItem); 
    
    const textoItem = document.createElement('span');
    textoItem.classList.add("texto-item");
    textoItem.textContent = item.nome;
    novoItem.appendChild(textoItem);

    novoItem.appendChild(botaoDeleta(item.id));

    lista.appendChild(novoItem);
}

Agora, antes do botão de deletar, a função cria um span com classe "text-item". Ao invés da atribuição incremental que o professor fez, coloquei o a propriedade nome no conteúdo de texto desse elemento e apensei ele em novoItem.

Por fim, acrescentei o seguinte código:

const itensTexto = document.querySelectorAll(".texto-item");

itensTexto.forEach(elemento => {
    elemento.addEventListener('dblclick', function() {
        this.contentEditable = true;
        const i = itens.findIndex(item => item.nome === this.textContent)

        this.addEventListener('focusout', function() {
            this.contentEditable = false;
            itens[i].nome = this.textContent;
            localStorage.setItem("itens", JSON.stringify(itens))
        })
    })
});

Ele cria um array itensTexto com todos os textos dos itens. Então, itera esse array acrescentando um escutador de eventos de clique duplo o qual aplica o atributo contenteditable com valor verdadeiro ao elemento para possibilitar que o html seja editado. Por fim, quando o item perde o foco, pega o texto que foi deixado nele, altera o objeto e atualiza o localStorage.

1 resposta
solução!

Oi, tudo bem?

Parece que você está realmente se aprofundando no curso e explorando além do que foi proposto. Isso é ótimo!

Sua lógica para editar o texto do item parece correta e bem pensada. Você envolveu o texto do item em um elemento <span> com uma classe específica e alterou a função criaElemento() para criar esse elemento. Isso parece uma boa prática, pois permite que você identifique e manipule facilmente esses elementos de texto no futuro.

Além disso, você adicionou um escutador de eventos para cada elemento de texto que permite que o usuário edite o texto ao clicar duas vezes nele. Quando o elemento perde o foco, você atualiza o objeto itens e o localStorage para refletir as alterações feitas pelo usuário. Isso parece uma boa maneira de manter os dados do usuário atualizados.

Parabéns! Ficou muito bom e obrigada por compartilhar com a gente o seu resultado.

Um abraço e bons estudos.