有多个工作签名面板

时间:2013-08-01 15:46:19

标签: javascript canvas html5-canvas signature

我的表格需要由三个人签名。我最初把它设置为由一个人签名,但发现我需要三个人。我不能让这三个人都工作。

Canvas Containers:

<div class="rowElem">
    <div id="container2">
    </div>
</div> 
<div class="rowElem">
    <div id="container3">
    </div>
</div>
<div class="rowElem">
    <div id="container4">
    </div>
</div> 

使用Javascript:

<script>


       (function (ns) {
    "use strict";

    ns.SignatureControl = function (options) {
        var containerId = options && options.canvasId || "container2",
            callback = options && options.callback || {},
            label = options && options.label || "Teacher Signature",
            cWidth = options && options.width || "300px",
            cHeight = options && options.height || "300px",
            btnClearId,
            canvas,
            ctx;

        function initCotnrol() {
            createControlElements();
            wireButtonEvents();
            canvas = _("signatureCanvas");
            canvas.addEventListener("mousedown", pointerDown, false);
            canvas.addEventListener("mouseup", pointerUp, false);
            ctx = canvas.getContext("2d");            
        }

        function createControlElements() {            
            var signatureArea = document.createElement("div"),
                labelDiv = document.createElement("div"),
                canvasDiv = document.createElement("div"),
                canvasElement = document.createElement("canvas"),
                buttonsContainer = document.createElement("div"),
                buttonClear = document.createElement("button");

            labelDiv.className = "signatureLabel";
            labelDiv.textContent = label;

            canvasElement.id = "signatureCanvas";
            canvasElement.clientWidth = cWidth;
            canvasElement.clientHeight = cHeight;
            canvasElement.style.border = "solid 2px black";
            canvasElement.style.background = "white";

            buttonClear.id = "btnClear";
            buttonClear.textContent = "Clear Signature Panel";

            canvasDiv.appendChild(canvasElement);
            buttonsContainer.appendChild(buttonClear);

            signatureArea.className = "signatureArea";
            signatureArea.appendChild(labelDiv);
            signatureArea.appendChild(canvasDiv);
            signatureArea.appendChild(buttonsContainer);

            _(containerId).appendChild(signatureArea);
        }

        function pointerDown(evt) {
            ctx.beginPath();
            ctx.moveTo(evt.offsetX, evt.offsetY);
            canvas.addEventListener("mousemove", paint, false);
        }

        function pointerUp(evt) {
            canvas.removeEventListener("mousemove", paint);
            paint(evt);
        }

        function paint(evt) {
            ctx.lineTo(evt.offsetX, evt.offsetY);
            ctx.stroke();
        }

        function wireButtonEvents() {
            var btnClear = _("btnClear");
            btnClear.addEventListener("click", function () {
                ctx.clearRect(0, 0, canvas.width, canvas.height);
            }, false);
        }

        function getSignatureImage() {
            return ctx.getImageData(0, 0, canvas.width, canvas.height).data;
        }

        return {
            init: initCotnrol,
            getSignatureImage: getSignatureImage
        };
    }
})(this.ns = this.ns || {});

这是启动器脚本:

    function teacherSig() {
            var signature = new ns.SignatureControl({ containerId: 'container2', callback: function () {
                } 
            });
            signature.init();
            _('btnClear').className = "greyishBtn";
        }

        window.addEventListener('DOMContentLoaded', teacherSig, false);
</script>

&#34; _&#34;是另一个文件中为document.getElementById设置的变量 - 我已经知道它有效,我在所有的js文件中使用它。

我尝试复制启动器脚本并更改函数名称/元素名称,但它没有任何好处。

非常感谢任何帮助。

如果有人知道更好的方法,我也可以试试。我在这个项目上耗尽了时间,这是客户最终添加的内容。如果有人知道另一个解决方案,一个插件或多个任何东西,我也可以这样做。

1 个答案:

答案 0 :(得分:2)

当您要求更好的方法时,我建议您使用easyCanvasJS来设置大多数非平凡的事情,但允许您像往常一样使用上下文和画布。

<强> ONLINE FIDDLE HERE

对于三个签名框,您需要做的就是以下内容(保留原始HTML代码,如帖子所示:

/// setup three canvases referencing parent Id and setting size:
var ez1 = new easyCanvas('container2', 350, 100),
    ez2 = new easyCanvas('container3', 350, 100),
    ez3 = new easyCanvas('container4', 350, 100);

/// common handler when mouse is held down, this = current easyCanvas instance
ez1.onmousemove =  ez2.onmousemove =  ez3.onmousemove = function(x, y) {
    /// instead of this.ctx.moveTo etc.. :
    this.strokeLine(this.prevX, this.prevY, x, y);
}

现在你有三个盒子可以登录。 strokeLine是用于绘制线条的简写函数,prevX/Y内部存储在easyCanvas实例上,xy已相对于画布进行了更正

(要访问画布,您只需引用ez.canvas以及上下文ez.ctxez.context)。

为了演示,我在HTML中添加了一些保存按钮,允许您将画布保存为图像:

save1.addEventListener('click', function(){download(ez1,1)}, false);
save2.addEventListener('click', function(){download(ez2,2)}, false);
save3.addEventListener('click', function(){download(ez3,3)}, false);

function download(ez, index) {
    /// show a save dialog with filename to save image here as png
    ez.download('Signature' + index + '.png');
}

如果您在内部需要数据,则可以执行此操作:

ez.canvas.toDataURL();

代替每个实例。

更新 - 例如:在单个保存按钮上执行:

function saveSignatures() {

    var sig1 = ez1.canvas.toDataURL();
    var sig2 = ez2.canvas.toDataURL();
    var sig3 = ez3.canvas.toDataURL();

    saveByAjax(sig1, sig2, sig3); // some ajax function to save the data
}

免责声明:JavaScript easyCanvas由我自己制作,免费并在GPL-3.0下获得许可。