1
resposta

[Dúvida] Gerar PDF em javascript

Estou com uma dúvida, ja quebrei a cabeça mas não da certo. Meu código gera uma listagem na tela e eu quero que ele gere a lista para o pdf, porem quando deixo a funcao de gerar pdf para gerar automatica, ela gera normal, agora se eu coloco para ela ser gerada por um botão vindo de um click, ela nao gera resultado algum, mesmo tendo todos os dados. Com certeza estou fazendo algo bem errado, javascript é cruel.

HTML

    <section class="bloco-listas d-none" id="lista-imprimir">
  <div class="listas" id="listas">
    <h1>Não posso esquecer</h1>
    <div class="lista-itens"></div>
  </div>
</section>
<section class="botoes d-none" id="botoesId">
  <a class="btn card-link" id="botaoPDF">Gerar PDF</a>
  <a class="btn card-link">Imprimir sem Formatação</a>
  <a class="btn card-link">Compartilhar</a>
</section>

JAVASCRIPT (Dessa forma esta dando errado)

    function mostrarBotoes() {
  let blocoListas = document.querySelector(".botoes");
  blocoListas.classList.remove("d-none");
  let botaoGeraPDF = document.querySelector("#botaoPDF");
  botaoGeraPDF.addEventListener("click", () => {
    gerarPDF();
  });
}

function gerarPDF() {
  var element = document.getElementById("lista-imprimir");
  html2pdf(element);
}

JAVASCRIPT (Dessa forma da certo)

function mostrarBotoes() {
  let blocoListas = document.querySelector(".botoes");
  blocoListas.classList.remove("d-none");
    gerarPDF();
}

function gerarPDF() {
  var element = document.getElementById("lista-imprimir");
  html2pdf(element);
}
1 resposta

Olá, Marcus.

Tudo bem?

O problema pode estar relacionado ao momento em que você está adicionando o evento de click ao botão. Se o JavaScript for executado antes do botão estar completamente carregado no DOM, o evento de click não será adicionado, porque o botão ainda não existe no momento em que o código é executado.

Uma maneira de resolver isso é colocando o seu código JavaScript que adiciona o evento de click dentro de um evento de 'DOMContentLoaded'. Este evento é disparado quando todo o conteúdo HTML foi completamente carregado. Veja como ficaria:

document.addEventListener('DOMContentLoaded', (event) => {
    function mostrarBotoes() {
        let blocoListas = document.querySelector(".botoes");
        blocoListas.classList.remove("d-none");
        let botaoGeraPDF = document.querySelector("#botaoPDF");
        botaoGeraPDF.addEventListener("click", () => {
            gerarPDF();
        });
    }

    function gerarPDF() {
        var element = document.getElementById("lista-imprimir");
        html2pdf(element);
    }

    mostrarBotoes();
});

Dessa forma, o código que adiciona o evento de click ao botão só será executado após todo o conteúdo HTML ser carregado, garantindo que o botão já exista no momento de adicionar o evento.

Se não funcionar, compartilha aqui o s seus códigos completos do HTML, JavaScript e CSS, assim conseguimos testar o projeto inteiro e ser mais assertivos na resposta. Você pode colá-los aqui mesmo.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos!