| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- const wrapper = document.getElementById("signature-pad");
- const clearButton = wrapper.querySelector("[data-action=clear]");
- //const changeBackgroundColorButton = wrapper.querySelector("[data-action=change-background-color]");
- //const changeColorButton = wrapper.querySelector("[data-action=change-color]");
- //const changeWidthButton = wrapper.querySelector("[data-action=change-width]");
- const undoButton = wrapper.querySelector("[data-action=undo]");
- const savePNGButton = wrapper.querySelector("[data-action=save-png]");
- //const saveJPGButton = wrapper.querySelector("[data-action=save-jpg]");
- //const saveSVGButton = wrapper.querySelector("[data-action=save-svg]");
- //const saveSVGWithBackgroundButton = wrapper.querySelector("[data-action=save-svg-with-background]");
- const canvas = wrapper.querySelector("canvas");
- const signaturePad = new SignaturePad(canvas, {
- // It's Necessary to use an opaque color when saving image as JPEG;
- // this option can be omitted if only saving as PNG or SVG
- backgroundColor: 'rgb(255, 255, 255)'
- });
- // Adjust canvas coordinate space taking into account pixel ratio,
- // to make it look crisp on mobile devices.
- // This also causes canvas to be cleared.
- function resizeCanvas() {
- // When zoomed out to less than 100%, for some very strange reason,
- // some browsers report devicePixelRatio as less than 1
- // and only part of the canvas is cleared then.
- const ratio = Math.max(window.devicePixelRatio || 1, 1);
- // This part causes the canvas to be cleared
- canvas.width = canvas.offsetWidth * ratio;
- canvas.height = canvas.offsetHeight * ratio;
- canvas.getContext("2d").scale(ratio, ratio);
- // This library does not listen for canvas changes, so after the canvas is automatically
- // cleared by the browser, SignaturePad#isEmpty might still return false, even though the
- // canvas looks empty, because the internal data of this library wasn't cleared. To make sure
- // that the state of this library is consistent with visual state of the canvas, you
- // have to clear it manually.
- //signaturePad.clear();
-
- // If you want to keep the drawing on resize instead of clearing it you can reset the data.
- signaturePad.fromData(signaturePad.toData());
- }
- // On mobile devices it might make more sense to listen to orientation change,
- // rather than window resize events.
- window.onresize = resizeCanvas;
- resizeCanvas();
- function download(dataURL, filename) {
- const blob = dataURLToBlob(dataURL);
- const url = window.URL.createObjectURL(blob);
- const a = document.createElement("a");
- a.style = "display: none";
- a.href = url;
- a.download = filename;
- document.body.appendChild(a);
- a.click();
- window.URL.revokeObjectURL(url);
- }
- // One could simply use Canvas#toBlob method instead, but it's just to show
- // that it can be done using result of SignaturePad#toDataURL.
- function dataURLToBlob(dataURL) {
- // Code taken from https://github.com/ebidel/filer.js
- const parts = dataURL.split(';base64,');
- const contentType = parts[0].split(":")[1];
- const raw = window.atob(parts[1]);
- const rawLength = raw.length;
- const uInt8Array = new Uint8Array(rawLength);
- for (let i = 0; i < rawLength; ++i) {
- uInt8Array[i] = raw.charCodeAt(i);
- }
- return new Blob([uInt8Array], { type: contentType });
- }
- clearButton.addEventListener("click", () => {
- signaturePad.clear();
- });
- undoButton.addEventListener("click", () => {
- const data = signaturePad.toData();
- if (data) {
- data.pop(); // remove the last dot or line
- signaturePad.fromData(data);
- }
- });
- /*
- changeBackgroundColorButton.addEventListener("click", () => {
- const r = Math.round(Math.random() * 255);
- const g = Math.round(Math.random() * 255);
- const b = Math.round(Math.random() * 255);
- const color = "rgb(" + r + "," + g + "," + b +")";
- signaturePad.backgroundColor = color;
- const data = signaturePad.toData();
- signaturePad.clear();
- signaturePad.fromData(data);
- });
- changeColorButton.addEventListener("click", () => {
- const r = Math.round(Math.random() * 255);
- const g = Math.round(Math.random() * 255);
- const b = Math.round(Math.random() * 255);
- const color = "rgb(" + r + "," + g + "," + b +")";
- signaturePad.penColor = color;
- });
- changeWidthButton.addEventListener("click", () => {
- const min = Math.round(Math.random() * 100) / 10;
- const max = Math.round(Math.random() * 100) / 10;
- signaturePad.minWidth = Math.min(min, max);
- signaturePad.maxWidth = Math.max(min, max);
- });
- */
- savePNGButton.addEventListener("click", () => {
- if (signaturePad.isEmpty()) {
- alert("Please provide a signature first.");
- } else {
- const dataURL = signaturePad.toDataURL();
- download(dataURL, "signature.png");
- }
- });
- /*
- saveJPGButton.addEventListener("click", () => {
- if (signaturePad.isEmpty()) {
- alert("Please provide a signature first.");
- } else {
- const dataURL = signaturePad.toDataURL("image/jpeg");
- download(dataURL, "signature.jpg");
- }
- });
- saveSVGButton.addEventListener("click", () => {
- if (signaturePad.isEmpty()) {
- alert("Please provide a signature first.");
- } else {
- const dataURL = signaturePad.toDataURL('image/svg+xml');
- download(dataURL, "signature.svg");
- }
- });
- saveSVGWithBackgroundButton.addEventListener("click", () => {
- if (signaturePad.isEmpty()) {
- alert("Please provide a signature first.");
- } else {
- const dataURL = signaturePad.toDataURL('image/svg+xml', {includeBackgroundColor: true});
- download(dataURL, "signature.svg");
- }
- });
- */
|