Introduction
Generate a screenshot using HTML and JavaScript, yeah that is what I meant. I was just searching for some unanswered article here, one member was asking about this, so I thought I would write a tip about that. Here it is, you can see the actual article reference
here.
Procedure
Step 1
You need an HTML page with some JavaScript code and CSS. That's all we need.
Create an HTML file just like this:
- <html lang="en">
- <head>
- <title>Take Web Page Screenshot with HTML5 and JavaScript </title>
- </head>
- <body>
- <a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate
- Screenshot »</a>
- </body>
- </html>
Step 2
If you want, you can create some styles and apply them.
Now it's time to create the JavaScript function generate() that I specified in an <a> tag.
- <script type="text/javascript">
- (function (exports) {
- function urlsToAbsolute(nodeList) {
- if (!nodeList.length) {
- return [];
- }
- var attrName = 'href';
- if (nodeList[0].__proto__ === HTMLImageElement.prototype || nodeList[0].__proto__ ===
- HTMLScriptElement.prototype) {
- attrName = 'src';
- }
- nodeList = [].map.call(nodeList, function (el, i) {
- var attr = el.getAttribute(attrName);
- if (!attr) {
- return;
- }
- var absURL = /^(https?|data):/i.test(attr);
- if (absURL) {
- return el;
- } else {
- return el;
- }
- });
- return nodeList;
- }
-
- function screenshotPage() {
- urlsToAbsolute(document.images);
- urlsToAbsolute(document.querySelectorAll("link[rel='stylesheet']"));
- var screenshot = document.documentElement.cloneNode(true);
- var b = document.createElement('base');
- b.href = document.location.protocol + '//' + location.host;
- var head = screenshot.querySelector('head');
- head.insertBefore(b, head.firstChild);
- screenshot.style.pointerEvents = 'none';
- screenshot.style.overflow = 'hidden';
- screenshot.style.webkitUserSelect = 'none';
- screenshot.style.mozUserSelect = 'none';
- screenshot.style.msUserSelect = 'none';
- screenshot.style.oUserSelect = 'none';
- screenshot.style.userSelect = 'none';
- screenshot.dataset.scrollX = window.scrollX;
- screenshot.dataset.scrollY = window.scrollY;
- var script = document.createElement('script');
- script.textContent = '(' + addOnPageLoad_.toString() + ')();';
- screenshot.querySelector('body').appendChild(script);
- var blob = new Blob([screenshot.outerHTML], {
- type: 'text/html'
- });
- return blob;
- }
-
- function addOnPageLoad_() {
- window.addEventListener('DOMContentLoaded', function (e) {
- var scrollX = document.documentElement.dataset.scrollX || 0;
- var scrollY = document.documentElement.dataset.scrollY || 0;
- window.scrollTo(scrollX, scrollY);
- });
- }
-
- function generate() {
- window.URL = window.URL || window.webkitURL;
- window.open(window.URL.createObjectURL(screenshotPage()));
- }
- exports.screenshotPage = screenshotPage;
- exports.generate = generate;
- })(window);
- </script>
Complete Code
Screenshot.html
- <html lang="en">
- <head>
- <title>Take Web Page Screenshot with HTML5 and JavaScript </title>
- </head>
- <body>
- <a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate
- Screenshot »</a>
- <script type="text/javascript">
- (function (exports) {
- function urlsToAbsolute(nodeList) {
- if (!nodeList.length) {
- return [];
- }
- var attrName = 'href';
- if (nodeList[0].__proto__ === HTMLImageElement.prototype || nodeList[0].__p roto__ === HTMLScriptElement.prototype) {
- attrName = 'src';
- }
- nodeList = [].map.call(nodeList, function (el, i) {
- var attr = el.getAttribute(attrName);
- if (!attr) {
- return;
- }
- var absURL = /^(https?|data):/i.test(attr);
- if (absURL) {
- return el;
- } else {
- return el;
- }
- });
- return nodeList;
- }
-
- function screenshotPage() {
- urlsToAbsolute(document.images);
- urlsToAbsolute(document.querySelectorAll("link[rel='stylesheet']"));
- var screenshot = document.documentElement.cloneNode(true);
- var b = document.createElement('base');
- b.href = document.location.protocol + '//' + location.host;
- var head = screenshot.querySelector('head');
- head.insertBefore(b, head.firstChild);
- screenshot.style.pointerEvents = 'none';
- screenshot.style.overflow = 'hidden';
- screenshot.style.webkitUserSelect = 'none';
- screenshot.style.mozUserSelect = 'none';
- screenshot.style.msUserSelect = 'none';
- screenshot.style.oUserSelect = 'none';
- screenshot.style.userSelect = 'none';
- screenshot.dataset.scrollX = window.scrollX;
- screenshot.dataset.scrollY = window.scrollY;
- var script = document.createElement('script');
- script.textContent = '(' + addOnPageLoad_.toString() + ')();';
- screenshot.querySelector('body').appendChild(script);
- var blob = new Blob([screenshot.outerHTML], {
- type: 'text/html'
- });
- return blob;
- }
-
- function addOnPageLoad_() {
- window.addEventListener('DOMContentLoaded', function (e) {
- var scrollX = document.documentElement.dataset.scrollX || 0;
- var scrollY = document.documentElement.dataset.scrollY || 0;
- window.scrollTo(scrollX, scrollY);
- });
- }
-
- function generate() {
- windowwindow.URL = window.URL || window.webkitURL;
- window.open(window.URL.createObjectURL(screenshotPage()));
- }
- exports.screenshotPage = screenshotPage;
- exports.generate = generate;
- })(window);
- </script>
- </body>
- </html>