You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
5.0 KiB

  1. debugger
  2. var wrapper = document.getElementById("signature-pad");
  3. var clearButton = wrapper.querySelector("[data-action=clear]");
  4. var changeColorButton = wrapper.querySelector("[data-action=change-color]");
  5. var undoButton = wrapper.querySelector("[data-action=undo]");
  6. var savePNGButton = wrapper.querySelector("[data-action=save-png]");
  7. var saveJPGButton = wrapper.querySelector("[data-action=save-jpg]");
  8. var saveSVGButton = wrapper.querySelector("[data-action=save-svg]");
  9. var canvas = wrapper.querySelector("canvas");
  10. var signaturePad = new SignaturePad(canvas, {
  11. // It's Necessary to use an opaque color when saving image as JPEG;
  12. // this option can be omitted if only saving as PNG or SVG
  13. backgroundColor: 'rgb(255, 255, 255)'
  14. });
  15. // Adjust canvas coordinate space taking into account pixel ratio,
  16. // to make it look crisp on mobile devices.
  17. // This also causes canvas to be cleared.
  18. function resizeCanvas() {
  19. // When zoomed out to less than 100%, for some very strange reason,
  20. // some browsers report devicePixelRatio as less than 1
  21. // and only part of the canvas is cleared then.
  22. var ratio = Math.max(window.devicePixelRatio || 1, 1);
  23. // This part causes the canvas to be cleared
  24. canvas.width = canvas.offsetWidth * ratio;
  25. canvas.height = canvas.offsetHeight * ratio;
  26. canvas.getContext("2d").scale(ratio, ratio);
  27. // This library does not listen for canvas changes, so after the canvas is automatically
  28. // cleared by the browser, SignaturePad#isEmpty might still return false, even though the
  29. // canvas looks empty, because the internal data of this library wasn't cleared. To make sure
  30. // that the state of this library is consistent with visual state of the canvas, you
  31. // have to clear it manually.
  32. signaturePad.clear();
  33. }
  34. // On mobile devices it might make more sense to listen to orientation change,
  35. // rather than window resize events.
  36. window.onresize = resizeCanvas;
  37. resizeCanvas();
  38. function download(dataURL, filename) {
  39. if (navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1) {
  40. window.open(dataURL);
  41. } else {
  42. var blob = dataURLToBlob(dataURL);
  43. var url = window.URL.createObjectURL(blob);
  44. var a = document.createElement("a");
  45. a.style = "display: none";
  46. a.href = url;
  47. a.download = filename;
  48. document.body.appendChild(a);
  49. a.click();
  50. window.URL.revokeObjectURL(url);
  51. }
  52. }
  53. // One could simply use Canvas#toBlob method instead, but it's just to show
  54. // that it can be done using result of SignaturePad#toDataURL.
  55. function dataURLToBlob(dataURL) {
  56. // Code taken from https://github.com/ebidel/filer.js
  57. var parts = dataURL.split(';base64,');
  58. var contentType = parts[0].split(":")[1];
  59. var raw = window.atob(parts[1]);
  60. var rawLength = raw.length;
  61. var uInt8Array = new Uint8Array(rawLength);
  62. for (var i = 0; i < rawLength; ++i) {
  63. uInt8Array[i] = raw.charCodeAt(i);
  64. }
  65. return new Blob([uInt8Array], { type: contentType });
  66. }
  67. clearButton.addEventListener("click", function (event) {
  68. signaturePad.clear();
  69. });
  70. undoButton.addEventListener("click", function (event) {
  71. var data = signaturePad.toData();
  72. if (data) {
  73. data.pop(); // remove the last dot or line
  74. signaturePad.fromData(data);
  75. }
  76. });
  77. changeColorButton.addEventListener("click", function (event) {
  78. var r = Math.round(Math.random() * 255);
  79. var g = Math.round(Math.random() * 255);
  80. var b = Math.round(Math.random() * 255);
  81. var color = "rgb(" + r + "," + g + "," + b + ")";
  82. signaturePad.penColor = color;
  83. });
  84. savePNGButton.addEventListener("click", function (event) {
  85. if (signaturePad.isEmpty()) {
  86. alert("Please provide a signature first.");
  87. } else {
  88. var dataURL = signaturePad.toDataURL();
  89. download(dataURL, "signature.png");
  90. }
  91. });
  92. saveJPGButton.addEventListener("click", function (event) {
  93. if (signaturePad.isEmpty()) {
  94. alert("Please provide a signature first.");
  95. } else {
  96. var dataURL = signaturePad.toDataURL("image/jpeg");
  97. download(dataURL, "signature.jpg");
  98. }
  99. });
  100. saveSVGButton.addEventListener("click", function (event) {
  101. if (signaturePad.isEmpty()) {
  102. alert("Please provide a signature first.");
  103. } else {
  104. var dataURL = signaturePad.toDataURL('image/svg+xml');
  105. download(dataURL, "signature.svg");
  106. }
  107. });
  108. function SaveImage() {
  109. if (signaturePad.isEmpty()) {
  110. alert("Please provide a signature first.");
  111. return false;
  112. } else {
  113. var dataURL = signaturePad.toDataURL('image/png');
  114. test(dataURL, "signature.svg");
  115. }
  116. }
  117. function test(dataURL, filename) {
  118. if (navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1) {
  119. window.open(dataURL);
  120. } else {
  121. var blob = dataURLToBlob(dataURL);
  122. var url = window.URL.createObjectURL(blob);
  123. document.getElementById('ContentPlaceHolder1_hddImgURL').value = dataURL.replace('data:image/png;base64,', '');
  124. }
  125. }