Saltar al contenido

Elemento de plantilla

En el mundo del desarrollo web, JavaScript desempeña un papel crucial para hacer que los sitios web sean dinámicos y atractivos. Una característica particularmente útil que ofrece es el <code><template></code> elemento. Este elemento permite a los desarrolladores crear fragmentos reutilizables de contenido HTML, que pueden utilizarse en diferentes partes de un sitio web. Profundicemos en el funcionamiento de esta poderosa herramienta.

Comprender el elemento de plantilla

El <code><template></code> elemento actúa como un contenedor para almacenar contenido HTML que no se renderiza inmediatamente en la página web. A diferencia de los elementos HTML normales, el contenido dentro de las plantillas permanece inerte hasta que se activa mediante JavaScript. Esta característica hace que las plantillas sean ideales para almacenar fragmentos de marcado que se reutilizarán o se mostrarán condicionalmente.


html
<body>
  <div>You won't see the template, as it's not activated using JS.</div>
  <div id="template-container">
    <template id="my-template">
      <h1>Hidden!</h1>
    </template>
  </div>
</body>

Clonar plantillas para contenido dinámico

Una de las ventajas clave de las plantillas HTML es su capacidad para generar clones de forma dinámica. Esto permite a los desarrolladores crear múltiples instancias del mismo marcado con datos o atributos únicos. Esta es la forma estándar de renderizar el contenido de una plantilla. El proceso implica seleccionar el contenido dentro del elemento de plantilla, clonarlo y luego insertarlo en el DOM.

WARNING

No olvides clonar el contenido de la plantilla antes de insertarlo en el DOM. Agregar o manipular directamente el contenido de la plantilla puede provocar cambios no deseados en la plantilla original y un comportamiento inesperado. Nota: Utiliza document.importNode(template.content, true) en lugar de cloneNode() para garantizar que los nodos clonados estén correctamente asociados con el documento actual.


html
<head>
  <style>
    .card {
      border: 1px solid #ccc;
      border-radius: 5px;
      padding: 10px;
      margin: 10px;
      width: 200px;
    }
    .card h3 {
      margin: 0;
    }
  </style>
</head>
<body>
  <div id="template-container">
    <!-- Template element -->
    <template id="card-template">
      <div class="card">
        <h3 id="card-title">Title</h3>
        <p id="card-content">Content goes here...</p>
      </div>
    </template>
  </div>

  <div id="card-container">
    <!-- Cards will be inserted here -->
  </div>

  <script>
    // Data for multiple cards
    const cardData = [
      { title: 'Card 1', content: 'This is the first card.' },
      { title: 'Card 2', content: 'This is the second card.' },
      { title: 'Card 3', content: 'This is the third card.' }
    ];

    // Function to create and insert cards
    function createCards(data) {
      const template = document.getElementById('card-template');

      data.forEach(item => {
        const clone = document.importNode(template.content, true);

        // Customize the cloned content
        clone.querySelector('#card-title').textContent = item.title;
        clone.querySelector('#card-content').textContent = item.content;

        // Insert the cloned content into the DOM
        document.getElementById('card-container').appendChild(clone);
      });
    }

    // Create cards with the provided data
    createCards(cardData);
  </script>
</body>

Mejorar la interactividad con JavaScript

JavaScript proporciona métodos para acceder al contenido dentro de una plantilla. Al utilizar la propiedad content de un elemento de plantilla, los desarrolladores pueden manipular su estructura interna de forma programática. Por ejemplo, template.content devuelve un DocumentFragment que contiene el marcado inerte.

Además, las plantillas HTML pueden combinarse con el manejo de eventos para crear interfaces de usuario interactivas. Al agregar oyentes de eventos al contenido de la plantilla, los desarrolladores pueden responder a las acciones del usuario y crear comportamientos dinámicos.


html
<body>
  <div id="template-container">
    <!-- Button Template -->
    <template id="button-template">
      <button id="show-content-btn">Add a content card</button>
    </template>

    <!-- Content Template -->
    <template id="content-template">
      <div class="content">
        <h2>Dynamic Content</h2>
        <p>This content is added dynamically when the button is clicked.</p>
      </div>
    </template>
  </div>

  <div id="button-container">
    <!-- Button will be inserted here -->
  </div>

  <div id="content-container">
    <!-- Content will be displayed here -->
  </div>

  <script>
    // Function to display template content
    function displayTemplateContent() {
      // Get the content template
      const contentTemplate = document.getElementById('content-template');
      // Access the .content property and clone it
      const contentClone = document.importNode(contentTemplate.content, true);

      // Display the cloned content
      document.getElementById('content-container').appendChild(contentClone);
    }

    // Insert the button template into the DOM
    function insertButton() {
      // Get the button template
      const buttonTemplate = document.getElementById('button-template');
      const buttonClone = document.importNode(buttonTemplate.content, true);

      // Add event listener to the button
      buttonClone.querySelector('#show-content-btn').addEventListener('click', displayTemplateContent);

      // Insert the button into the DOM
      document.getElementById('button-container').appendChild(buttonClone);
    }

    // Call the function to insert the button when the page loads
    insertButton();
  </script>
</body>

En este ejemplo:

  • Tenemos dos plantillas: una para un botón (button-template) y otra para el contenido (content-template).
  • La función insertButton clona la plantilla del botón y la inserta en el DOM. También adjunta un oyente de eventos al botón para llamar a la función displayTemplateContent cuando se hace clic.
  • La función displayTemplateContent clona la plantilla de contenido y la inserta en el DOM cada vez que se hace clic en el botón.
  • El botón se inserta en el DOM cuando se carga la página al llamar a insertButton.

Por lo tanto, cuando hagas clic en el botón «Prueba tú mismo», verás un botón etiquetado como «Agregar una tarjeta de contenido». Cada vez que hagas clic en el botón, se agregará un nuevo fragmento de contenido de la plantilla de contenido a la página, demostrando interactividad e inserción dinámica de contenido.

Conclusión

Las plantillas HTML ofrecen una forma conveniente de gestionar el contenido HTML en aplicaciones web. Su versatilidad y facilidad de uso las convierten en herramientas invaluables para los desarrolladores que buscan optimizar su flujo de trabajo y crear experiencias de usuario atractivas. Al dominar el <code><template></code> elemento, los desarrolladores pueden desbloquear nuevas posibilidades para construir sitios web dinámicos e interactivos.

Práctica

¿Cuál es el propósito principal del elemento de plantilla en JavaScript?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.