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:
  1. <html lang="en">
  2. <head>
  3. <title>Take Web Page Screenshot with HTML5 and JavaScript </title>
  4. </head>
  5. <body>
  6. <a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate
  7. Screenshot »</a>
  8. </body>
  9. </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.
  1. <script type="text/javascript">
  2. (function (exports) {
  3. function urlsToAbsolute(nodeList) {
  4. if (!nodeList.length) {
  5. return [];
  6. }
  7. var attrName = 'href';
  8. if (nodeList[0].__proto__ === HTMLImageElement.prototype || nodeList[0].__proto__ ===
  9. HTMLScriptElement.prototype) {
  10. attrName = 'src';
  11. }
  12. nodeList = [].map.call(nodeList, function (el, i) {
  13. var attr = el.getAttribute(attrName);
  14. if (!attr) {
  15. return;
  16. }
  17. var absURL = /^(https?|data):/i.test(attr);
  18. if (absURL) {
  19. return el;
  20. } else {
  21. return el;
  22. }
  23. });
  24. return nodeList;
  25. }
  26. function screenshotPage() {
  27. urlsToAbsolute(document.images);
  28. urlsToAbsolute(document.querySelectorAll("link[rel='stylesheet']"));
  29. var screenshot = document.documentElement.cloneNode(true);
  30. var b = document.createElement('base');
  31. b.href = document.location.protocol + '//' + location.host;
  32. var head = screenshot.querySelector('head');
  33. head.insertBefore(b, head.firstChild);
  34. screenshot.style.pointerEvents = 'none';
  35. screenshot.style.overflow = 'hidden';
  36. screenshot.style.webkitUserSelect = 'none';
  37. screenshot.style.mozUserSelect = 'none';
  38. screenshot.style.msUserSelect = 'none';
  39. screenshot.style.oUserSelect = 'none';
  40. screenshot.style.userSelect = 'none';
  41. screenshot.dataset.scrollX = window.scrollX;
  42. screenshot.dataset.scrollY = window.scrollY;
  43. var script = document.createElement('script');
  44. script.textContent = '(' + addOnPageLoad_.toString() + ')();';
  45. screenshot.querySelector('body').appendChild(script);
  46. var blob = new Blob([screenshot.outerHTML], {
  47. type: 'text/html'
  48. });
  49. return blob;
  50. }
  51. function addOnPageLoad_() {
  52. window.addEventListener('DOMContentLoaded', function (e) {
  53. var scrollX = document.documentElement.dataset.scrollX || 0;
  54. var scrollY = document.documentElement.dataset.scrollY || 0;
  55. window.scrollTo(scrollX, scrollY);
  56. });
  57. }
  58. function generate() {
  59. window.URL = window.URL || window.webkitURL;
  60. window.open(window.URL.createObjectURL(screenshotPage()));
  61. }
  62. exports.screenshotPage = screenshotPage;
  63. exports.generate = generate;
  64. })(window);
  65. </script>
Complete Code
Screenshot.html
  1. <html lang="en">
  2. <head>
  3. <title>Take Web Page Screenshot with HTML5 and JavaScript </title>
  4. </head>
  5. <body>
  6. <a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate
  7. Screenshot »</a>
  8. <script type="text/javascript">
  9. (function (exports) {
  10. function urlsToAbsolute(nodeList) {
  11. if (!nodeList.length) {
  12. return [];
  13. }
  14. var attrName = 'href';
  15. if (nodeList[0].__proto__ === HTMLImageElement.prototype || nodeList[0].__p roto__ === HTMLScriptElement.prototype) {
  16. attrName = 'src';
  17. }
  18. nodeList = [].map.call(nodeList, function (el, i) {
  19. var attr = el.getAttribute(attrName);
  20. if (!attr) {
  21. return;
  22. }
  23. var absURL = /^(https?|data):/i.test(attr);
  24. if (absURL) {
  25. return el;
  26. } else {
  27. return el;
  28. }
  29. });
  30. return nodeList;
  31. }
  32. function screenshotPage() {
  33. urlsToAbsolute(document.images);
  34. urlsToAbsolute(document.querySelectorAll("link[rel='stylesheet']"));
  35. var screenshot = document.documentElement.cloneNode(true);
  36. var b = document.createElement('base');
  37. b.href = document.location.protocol + '//' + location.host;
  38. var head = screenshot.querySelector('head');
  39. head.insertBefore(b, head.firstChild);
  40. screenshot.style.pointerEvents = 'none';
  41. screenshot.style.overflow = 'hidden';
  42. screenshot.style.webkitUserSelect = 'none';
  43. screenshot.style.mozUserSelect = 'none';
  44. screenshot.style.msUserSelect = 'none';
  45. screenshot.style.oUserSelect = 'none';
  46. screenshot.style.userSelect = 'none';
  47. screenshot.dataset.scrollX = window.scrollX;
  48. screenshot.dataset.scrollY = window.scrollY;
  49. var script = document.createElement('script');
  50. script.textContent = '(' + addOnPageLoad_.toString() + ')();';
  51. screenshot.querySelector('body').appendChild(script);
  52. var blob = new Blob([screenshot.outerHTML], {
  53. type: 'text/html'
  54. });
  55. return blob;
  56. }
  57. function addOnPageLoad_() {
  58. window.addEventListener('DOMContentLoaded', function (e) {
  59. var scrollX = document.documentElement.dataset.scrollX || 0;
  60. var scrollY = document.documentElement.dataset.scrollY || 0;
  61. window.scrollTo(scrollX, scrollY);
  62. });
  63. }
  64. function generate() {
  65. windowwindow.URL = window.URL || window.webkitURL;
  66. window.open(window.URL.createObjectURL(screenshotPage()));
  67. }
  68. exports.screenshotPage = screenshotPage;
  69. exports.generate = generate;
  70. })(window);
  71. </script>
  72. </body>
  73. </html>