Building a Pager Web Component – Part 3: HTML Import
In the last post, we made use of a template and shadow DOM in our pager web component. In this post, we will make use of HTML import and put our pager web component in a separate file.
Moving the component bits to a separate file
Firstly, let’s create a new file called “pager.html” for our web component and move the template and script tag into there. The contents of pager.html should now be:
<template>
<style>
.x-pager-link {
margin-right: 6px;
text-decoration: none;
}
a.x-pager-link:hover {
text-decoration: underline;
}
.x-pager-text {
margin-left: 20px;
}
</style>
<div>
<a href="#" title="Go to the first page" class="x-pager-link">first</a>
<a href="#" title="Go to the previous page" class="x-pager-link"
>previous</a
>
<a href="#" title="Go to the next page" class="x-pager-link">next</a>
<a href="#" title="Go to the last page" class="x-pager-link">last</a>
<span class="x-pager-text">page x of y</span>
</div>
</template>
<script>
(function() {
var Proto = Object.create(HTMLElement.prototype),
root;
Proto.createdCallback = function() {
var template = document.querySelector("template"),
clone = document.importNode(template.content, true);
root = this.createShadowRoot();
root.appendChild(clone);
};
document.registerElement("x-pager", { prototype: Proto });
})();
</script>
Referencing the component
In our page, we can now reference the pager component using a HTML import link tag . The HTML in our page should now be:
<!DOCTYPE html>
<html>
<head>
<link rel="import" href="pager.html" />
</head>
<body>
<h1>my app</h1>
<x-pager page="1" page-count="5"></x-pager>
</body>
</html>
document.currentScript.ownerDocument
If we test our component now by navigating to our page, the component will not work. The problem is how we are referencing the template - document.querySelector("template")
does not find it.
We need to get a reference to the web component document using document.currentScript.ownerDocument
and select the template in this. Our changed pager component markup show now be:
<template>
<style>
.x-pager-link {
margin-right: 6px;
text-decoration: none;
}
a.x-pager-link:hover {
text-decoration: underline;
}
.x-pager-text {
margin-left: 20px;
}
</style>
<div>
<a href="#" title="Go to the first page" class="x-pager-link">first</a>
<a href="#" title="Go to the previous page" class="x-pager-link"
>previous</a
>
<a href="#" title="Go to the next page" class="x-pager-link">next</a>
<a href="#" title="Go to the last page" class="x-pager-link">last</a>
<span class="x-pager-text">page x of y</span>
</div>
</template>
<script>
(function() {
var Proto = Object.create(HTMLElement.prototype),
importDoc = document.currentScript.ownerDocument,
root;
Proto.createdCallback = function() {
var template = importDoc.querySelector("template"),
clone = document.importNode(template.content, true);
root = this.createShadowRoot();
root.appendChild(clone);
};
document.registerElement("x-pager", { prototype: Proto });
})();
</script>
In the next post we will look at reading the attributes “page” and “page-count”.