Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro add DOM - JS - Failed to execute 'appendChild' on 'Node';

Fiz o passo a passo com o professor e deu certo, porém após a aula tentei fazer novamente para fixar o conteúdo e acabou por dar um erro inesperado. Não consigo localizar o problema! No navegador surge o seguinte problema:script.js:13 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'. at HTMLButtonElement.criarTarefa (script.js:13) Já vi em todos os locais e comparei com o código do professor, tudo "igual".

Poderiam me dar um help?

Meu código HTML:

<body>
    <div class="total">
        <div class="total__list">

            <h1 class="total__titulo">Ceep</h1>

            <form class="total__form form">
                <input type="text" class="form__texto" data-form-input>
                <button class="form__botao" data-form-button> Novo item </button>
            </form>

            <ol class="form__lista lista">
                <!-- <li class="lista__item">Olá mundo</li> -->
            </ol>
        </div>
    </div>
    <script src="script.js"></script>
</body>

Meu código JS :

const criarTarefa = (evento) => {
    evento.preventDefault();

    const lista = document.querySelector('.lista');
    const input = document.querySelector('.form__texto');
    const valor = input.value;

    let tarefa = document.createElement('li');
    tarefa.classList.add('lista__item');
    const conteudo = `<p class = "content">${valor}</p>`;

    tarefa.innerHTML = conteudo;
    tarefa.appendChild(BotaoConclui());
    tarefa.appendChild(BotaoDeleta());
    lista.appendChild(tarefa);
    input.value = "";
};

const novaTarefa = window.document.querySelector('.form__botao');

novaTarefa.addEventListener('click', criarTarefa);

const BotaoConclui = () => {
    const botaoConclui = document.createElement('button');
    botaoConclui.classList.add('form__button');
    botaoConclui.innerText = 'Concluir';
    botaoConclui.addEventListener('click', concluirTarefa);

    return BotaoConclui;
};

const concluirTarefa = (evento) => {
    const botaoConclui = evento.target;
    const tarefaCompleta = botaoConclui.parentElement;

    tarefaCompleta.classList.toggle('done');
};

const BotaoDeleta = () => {
    const botaoDeleta = document.createElement('button');
    botaoDeleta.innerText = 'Deletar';
    botaoDeleta.addEventListener('click', deletarTarefa);

    return BotaoDeleta;

};

const deletarTarefa = (evento) => {
    const botaoDeleta = evento.target;

    const tarefaCompleta = botaoDeleta.parentElement;

    tarefaCompleta.remove();

    return botaoDeleta;
};
2 respostas
solução!

Oi Roger!

Vamos dar uma analisada na mensagem de erro:

script.js:13 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'. at HTMLButtonElement.criarTarefa (script.js:13) 

Ela está dizendo que teve um erro de tipo. O comando appendChild na linha 13 do arquivo script.js deu erro porque o parâmetro esperado era um Node mas o que foi passado não era.

Vamos ver agora sua linha 13:

tarefa.appendChild(BotaoConclui());

O que você escreveu está correto, mas pela mensagem de erro, podemos perceber que BotaoConclui() era pra estar retornando um Node, ou seja, um elemento HTML, mas não está. Então algo deve estar errado em "BotaoConclui".

const BotaoConclui = () => {
    const botaoConclui = document.createElement('button');
    botaoConclui.classList.add('form__button');
    botaoConclui.innerText = 'Concluir';
    botaoConclui.addEventListener('click', concluirTarefa);

    return BotaoConclui; // <- BotaoConclui em vez de botaoConclui
};

O corpo da função está correto, mas note que o return está referenciando a própria função e não a variável botaoConclui criada na primeira linha! Pra consertar isso, basta mudar para

return botaoConclui;

Note também que é necessário fazer a mesma correção no BotaoDeleta(), pois ele retorna BotaoDeleta em vez de botaoDeleta.

A mensagem de erro não apontou o local exato do erro, mas o tipo do erro deu uma pista de onde o problema real estava! Na próxima vez que algum erro acontecer, tente realizar uma análise parecida com a que eu fiz agora, esse processo vai te ajudar muito a achar o problema.

Espero ter ajudado! Qualquer outra dúvida poste aqui :) Bons estudos.

Eduardo, muito obrigado!

Com sua explicação ficou bastante claro o problema rsrsrs!!

Valeu