使用 signature_pad 与 bootstrap 模式和 ajax 保存

Using signature_pad with bootstrap modal and ajax saving

使用 this code 将签名块插入表单。 使用标准的 HTML 表单,效果很好(即非 ajax 调用,但提交给 URL 的表单)。

但我现在要做的是在页面上的 bootstrap 模态元素中添加 canvas,该元素最初是隐藏的。 然后我将模式设置为显示,并启动 canvas。 然后 - 当提交表单(包括填写的签名)时 - 表单数据通过 ajax (jQuery).

保存

我的问题是,在触发 ajax 保存时,我不断收到与 canvas/signaturePad 未定义相关的错误 - signaturePad is not defined

这是签名代码,包含在bootstrap modal:

 <div id="signature-pad" class="signature-pad">
    <div class="signature-pad--body">
      <canvas></canvas>
    </div>
  </div>

这是 jQuery 代码,当我启动模态时(效果很好 - 我可以在 canvas 上签名):

       $("#ModalActionCost").modal('show');

       var wrapper = document.getElementById("signature-pad");
        var canvas = wrapper.querySelector("canvas");
        var signaturePad = new SignaturePad(canvas, {
          backgroundColor: 'rgb(255, 255, 255)'
        });

这是我保存表单内容时的代码:

    $("#trigger").click(function(e){

        var dataURL = signaturePad.toDataURL();   <-- this is the line I get the error on.
        $("#hiddenSignature").val(signaturePad.toDataURL("image/png").replace("data:image/png;base64,", ""));

        var hiddenSignature = $("#hiddenSignature").val();
        // ajax call follows.
        ......
   });

我得到的错误是:signaturePad is not defined

为了尝试解决这个错误,我想我需要在通过 ajax 保存时再次启动 canvas(调用 var signaturePad...)——这确实有效,而且 pad blob 值已发送 - 但当然我得到一个空白 canvas,因为它在重新定义时已被擦除。

我整理了一个 jsfiddle 流程的简化版本 - 它似乎有效 enter link description here,但我无法弄清楚为什么我的上面的版本不起作用。

我的解决方案,对其他人:

将创建 signature_pad 的实例 - 从打开模式的函数 - 移动到一般页面的 onload

    var wrapper = document.getElementById("signature-pad");
    var canvas = wrapper.querySelector("canvas");
    var signaturePad = new SignaturePad(canvas, {
      backgroundColor: 'rgb(255, 255, 255)'
    });

不确定您的代码到底出了什么问题,但您可以采取以下措施来解决它。

检查您的包装器和 canvas 变量,使用与 canvas 相同的 console.log(wrapper); 查看它们是否未定义或为空。 如果它们实际上具有值,那么在您的代码中,signaturePad 变量可能会在点击触发器之前被覆盖,或者无法从点击事件中访问(超出范围)。

我建议解决它的方法是给 canvas 本身一个 id :

<canvas id="SignaturePadCanvas"></canvas>

然后这样做:

const canvas  = document.querySelector("#SignaturePadCanvas");
const context = canvas.getContext("2d");
const signaturePad = new SignaturePad(canvas, {
          backgroundColor: 'rgb(255, 255, 255)'
        });

$("#trigger").click(function(e){

    if(signaturePad == null || signaturePad == undefined)
    {
        console.log(canvas); //  debuging 
        return alert('signaturePad is undefined');
    }

    var dataURL = signaturePad.toDataURL();   

    if (_signature.isEmpty()) {      
      return alert("cannot get the data of an empty signature");
    }   

    $("#hiddenSignature").val(signaturePad.toDataURL("image/png").replace("data:image/png;base64,", ""));

    var hiddenSignature = $("#hiddenSignature").val();

});