/** * Basic Canvas Paint * Copyright (c) 2018-2021 Alexandre Bobkov * Licensed under MIT * @author Alexandre Bobkov * @version 0.7.3 */ $(document).ready(function(){ $('body').on('click', '.bcPaint-palette-color', function(){ $(this).parent().find('.selected').removeClass('selected'); $(this).addClass('selected'); $.fn.bcPaint.setColor($(this).css('background-color')); }); $('body').on('click', '#bcPaint-reset', function(){ $.fn.bcPaint.clearCanvas(); }); $('body').on('click', '#bcPaint-export', function(){ $.fn.bcPaint.export(); }); }); (function( $ ) { /** * Private variables **/ var isDragged = false, startPoint = { x:0, y:0 }, templates = { container : $('
'), color : $('
'), canvasContainer : $('
'), canvasPane : $(''), bottom : $('
'), buttonReset : $(' '), buttonSave : $(' ') }, paintCanvas, paintContext; /** * Assembly and initialize plugin **/ $.fn.bcPaint = function (options) { return this.each(function () { var rootElement = $(this), colorSet = $.extend({}, $.fn.bcPaint.defaults, options), defaultColor = (rootElement.val().length > 0) ? rootElement.val() : colorSet.defaultColor, container = templates.container.clone(), // header = templates.header.clone(), canvasContainer = templates.canvasContainer.clone(), canvasPane = templates.canvasPane.clone(), bottom = templates.bottom.clone(), buttonReset = templates.buttonReset.clone(), buttonSave = templates.buttonSave.clone(), color; // assembly pane rootElement.append(container); // container.append(header); container.append(canvasContainer); container.append(bottom); canvasContainer.append(canvasPane); bottom.append(buttonReset); bottom.append(buttonSave); // set canvas pane width and height var bcCanvas = rootElement.find('canvas'); var bcCanvasContainer = rootElement.find('#bcPaint-canvas-container'); bcCanvas.attr('width', bcCanvasContainer.width()); bcCanvas.attr('height', bcCanvasContainer.height()); // get canvas pane context paintCanvas = document.getElementById('bcPaintCanvas'); paintContext = paintCanvas.getContext('2d'); // bind mouse actions paintCanvas.onmousedown = $.fn.bcPaint.onMouseDown; paintCanvas.onmouseup = $.fn.bcPaint.onMouseUp; paintCanvas.onmousemove = $.fn.bcPaint.onMouseMove; // bind touch actions paintCanvas.addEventListener('touchstart', function(e){ $.fn.bcPaint.dispatchMouseEvent(e, 'mousedown'); }); paintCanvas.addEventListener('touchend', function(e){ $.fn.bcPaint.dispatchMouseEvent(e, 'mouseup'); }); paintCanvas.addEventListener('touchmove', function(e){ $.fn.bcPaint.dispatchMouseEvent(e, 'mousemove'); }); // Prevent scrolling on touch event document.body.addEventListener("touchstart", function (e) { if (e.target == 'paintCanvas') { e.preventDefault(); } }, false); document.body.addEventListener("touchend", function (e) { if (e.target == 'paintCanvas') { e.preventDefault(); } }, false); document.body.addEventListener("touchmove", function (e) { if (e.target == 'paintCanvas') { e.preventDefault(); } }, false); }); } /** * Extend plugin **/ $.extend(true, $.fn.bcPaint, { /** * Dispatch mouse event */ dispatchMouseEvent : function(e, mouseAction){ var touch = e.touches[0]; if(touch == undefined){ touch = { clientX : 0, clientY : 0 }; } var mouseEvent = new MouseEvent(mouseAction, { clientX: touch.clientX, clientY: touch.clientY }); paintCanvas.dispatchEvent(mouseEvent); }, /** * Remove pane */ clearCanvas : function(){ paintCanvas.width = paintCanvas.width; }, /** * On mouse down **/ onMouseDown : function(e){ isDragged = true; // get mouse x and y coordinates startPoint.x = e.offsetX; startPoint.y = e.offsetY; // begin context path paintContext.beginPath(); paintContext.moveTo(startPoint.x, startPoint.y); }, /** * On mouse up **/ onMouseUp : function() { isDragged = false; }, /** * On mouse move **/ onMouseMove : function(e){ if(isDragged){ paintContext.lineTo(e.offsetX, e.offsetY); paintContext.stroke(); } }, /** * Export / Save image */ export : function(){ var imgData = paintCanvas.toDataURL('image/png'); $('#answer729733X800X4213').val(imgData); // $('#signatureField').attr("src", imgData); // var windowOpen = window.open('about:blank', 'Image'); // windowOpen.document.write('Exported Image'); }, }); })(jQuery);