Поле для личной подписи, автографа

75
Алексей,

Сделано на canvas, работает как на десктопе, так и на "тач" устройствах. Итоговое изображение можно сохранить в jpg файл.

Сделано на canvas, работает как на десктопе, так и на "тач" устройствах. Итоговое изображение можно сохранить в jpg файл.

Пример:

Код ниже. Он кажется большим, но по сути там : 1 canvas поле, 3 функции для рисования и 2 для сохранения/сброса и всё. Не забудьте поменять пути к скрипту /path/to/sign.php.

<?php
if ($_POST['signature']) { // сохраняем в файл
	$_POST['signature'] = str_replace(['data:image/jpeg;base64,', ' '], ['', '+'], $_POST['signature']);
	if (file_put_contents('sign.jpg', base64_decode($_POST['signature']))) {
		echo 'sign.jpg'; exit;
	}
}
?>
<meta name="viewport" content="width=device-width,user-scalable=no" />
<canvas id="signature" width="400" height="240" style="border: 1px solid"></canvas><br /><br />
<button id="signature-save">Сохранить</button>
<button id="signature-clear">Очистить</button>
<script>
	var canvas = document.getElementById("signature"),
		context = canvas.getContext("2d"),
		mouse = {x:0, y:0},
		draw = false;

	context.fillStyle = "white"; // белый фон
	context.fillRect(0, 0, canvas.width, canvas.height);

	['mousedown', 'touchstart'].forEach(function (eventName) { // касание экране, начало рисования
		canvas.addEventListener(eventName, function(e){
			e.preventDefault();
			draw = true;
			mouse = {
				x: ((eventName === 'mousedown') ? e.pageX : e.touches[0].pageX) - this.offsetLeft,
				y: ((eventName === 'mousedown') ? e.pageY : e.touches[0].pageY) - this.offsetTop
			}
			context.beginPath();
			context.moveTo(mouse.x, mouse.y);
			context.lineTo(mouse.x+1, mouse.y+1);
			context.stroke();
		});
	});

	['mousemove', 'touchmove'].forEach(function (eventName) { // движение мыши/пальца
		canvas.addEventListener(eventName, function(e){
			e.preventDefault();
			if (draw === true){
				mouse = {
					x: ((eventName === 'mousemove') ? e.pageX : e.touches[0].pageX) - this.offsetLeft,
					y: ((eventName === 'mousemove') ? e.pageY : e.touches[0].pageY) - this.offsetTop
				}
				context.lineTo(mouse.x, mouse.y);
				context.stroke();
			}
		});
	});

	['mouseup', 'touchend'].forEach(function (eventName) { // окончание
		canvas.addEventListener(eventName, function (e) {
			e.preventDefault();
			if (eventName === 'mouseup') {
				mouse = {
					x: e.pageX - this.offsetLeft,
					y: e.pageY - this.offsetTop
				}
				context.lineTo(mouse.x, mouse.y);
				context.stroke();
			}
			context.closePath();
			draw = false;
		});
	});

	document.getElementById('signature-save').addEventListener('click', function () { // ajax запрос на сохранение
		let ajax = new XMLHttpRequest();
		ajax.open("POST", "/path/to/sign.php");
		ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		ajax.onload = function() {
			let link = document.createElement("a");
			link.setAttribute("href", ajax.responseText);
			link.setAttribute("download", 'sign.jpg');
			link.click();
		}
		ajax.send("signature=" + document.getElementById("signature").toDataURL('image/jpeg'));
	});

	document.getElementById('signature-clear').addEventListener('click', function () { // очищаем 
		var canvas = document.getElementById("signature"),
			context = canvas.getContext("2d");
		context.fillStyle = "white";
		context.fillRect(0, 0, canvas.width, canvas.height);
	});
</script>

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 7 октября 2022
js, html, готовый код, разработчику
Поделиться
Комментарии
Авторизуйтесь чтобы получать уведомления об ответе
Сделано на canvas, работает как на десктопе, так и на "тач" устройствах. Итоговое изображение можно сохранить в jpg файл.