Summary
The HTML template element <template>
is a mechanism for holding client-side content that is not to be rendered when a page is loaded but may subsequently be instantiated during runtime using JavaScript.
Think of a template as a content fragment that is being stored for subsequent use in the document. The parser does process the content of the <template>
element during the page load to ensure that it is valid, however.
- Content categories Metadata content, flow content, phrasing content, script-supporting element
- Permitted content Metadata content, flow content, any valid HTML content that is permitted to occur within the {{HTMLElement("ol")}}, {{HTMLElement("dl")}}, {{HTMLElement("figure")}}, {{HTMLElement("ruby")}}, {{HTMLElement("object")}}, {{HTMLElement("video")}}, {{HTMLElement("audio")}}, {{HTMLElement("table")}}, {{HTMLElement("colgroup")}}, {{HTMLElement("thead")}}, {{HTMLElement("tbody")}}, {{HTMLElement("tfoot")}}, {{HTMLElement("tr")}}, {{HTMLElement("fieldset")}}, {{HTMLElement("select")}}, {{HTMLElement("details")}} elements and {{HTMLElement("menu")}} whose
type
attribute is in popup menu state. - Tag omission {{no_tag_omission}}
- Permitted parent elements{{HTMLElement("body")}}, {{HTMLElement("frameset")}}, {{HTMLElement("head")}} and {{HTMLElement("colgroup")}} without a
span
attribute - DOM interface {{domxref("HTMLTemplateElement")}}
Attributes
This element includes the global attributes.
There is also a content
attribute, which is read-only. It provides access to the contents of the template. The existence of the content
attribute is often used as a way of determining if a particular browser supports the <template>
element.
Examples
First we start with the HTML portion of the example.
<table id="producttable"> <thead> <tr> <td>UPC_Code</td> <td>Product_Name</td> </tr> </thead> <tbody> <!-- existing data could optionally be included here --> </tbody> </table> <template id="productrow"> <tr> <td class="record"></td> <td></td> </tr> </template>
Then we see the JavaScript portion of the example, which can be used to instantiate the HTML.
// Test to see if the browser supports the HTML template element by checking // for the presence of the template element's content attribute. if ('content' in document.createElement('template')) { // Instantiate the table with the existing HTML tbody and the row with the template var t = document.querySelector('#productrow'), td = t.content.querySelectorAll("td"); td[0].textContent = "1235646565"; td[1].textContent = "Stuff"; // Clone the new row and insert it into the table var tb = document.getElementsByTagName("tbody"); var clone = document.importNode(t.content, true); tb[0].appendChild(clone); // Create a new row td[0].textContent = "0384928528"; td[1].textContent = "Acme Kidney Beans"; // Clone the new row and insert it into the table var clone2 = document.importNode(t.content, true); tb[0].appendChild(clone2); } else { // Find another way to add the rows to the table because // the HTML template element is not supported. }
The result is the original HTML table, with two new rows appended to it via JavaScript.
You can see a live example here (code is displayed here).
Specifications
Specification | Status | Comment |
---|---|---|
{{SpecName('HTML WHATWG','/scripting-1.html#the-template-element','template element')}} | {{Spec2('HTML WHATWG')}} | No change |
{{SpecName('HTML5 W3C','/scripting-1.html#the-template-element','template element')}} | {{Spec2('HTML5 W3C')}} | Initial definition |
Browser compatibility
{{CompatibilityTable}}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | 26 | {{CompatGeckoDesktop("22")}} | {{CompatNo}} | 15 | 7.1 |
Feature | Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | iOS 8 |
See also
- Web components: {{HTMLElement("content")}}, {{HTMLElement("decorator")}}, {{HTMLElement("element")}}, {{HTMLElement("shadow")}}