【问题标题】:How can I validate I have drawn something in jSignature panel or not?如何验证我是否在 jSignature 面板中绘制了一些东西?
【发布时间】:2012-12-17 12:37:53
【问题描述】:

jSignature 有画布并且有一个类。我如何验证 jSignature 我是否画了一些东西?

我为点击事件添加了一个绑定。

$sigdiv.bind('click', function(e) {
    $("#num_strok").val(parseInt($("#num_strok").val()) + 1);
});

问题是即使我点击了某个角落,num_strock 也会增加。对于一些拖动它不会增加。

我已经在 Google 中尝试过是否有任何内置的 isEmpty 函数。但我还没有找到任何东西。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:
     if( $sigdiv.jSignature('getData', 'native').length == 0) {
        alert('Please Enter Signature..');
     }
    

    【讨论】:

    • 这似乎是一个不错的方法。它不需要任何额外的 jSig 插件、额外的绑定或任何标志来维护。
    • 这适用于原生选项。但其他像 svgbase64 不会。
    【解决方案2】:

    聚会很晚...所以我想就我的发现提供一些意见,每个都与 使用$("#sigDiv").jSignature('getData', 'putSomethignInHere') 函数来验证签名是否存在。

    以下是我为传递给 jSignature 函数的第二个属性检查过的选项:

    native 在 sig 框为空时返回对象 .length == 0 的对象,但在 sig 框中有东西时返回 .length > 0。如果您想知道有多少笔画,只需使用此对象的长度即可。 注意:根据 jSignature 文档:

    “Stroke = mousedown + mousemoved * n (+ mouseup 但我们没有记录,因为那是“结束/缺乏移动”指示器)”

    base30 也返回一个对象。这里我查看了这个对象的第二个索引位置的信息。 x = $("#sigDiv").jSignature('getData', 'base30')[1].length > 0 ? TRUE : FALSE 此处 x 如果该框已签名,则为 TRUE,而当 jSig 框保持不变时,则为 FALSE。

    在我的例子中,我使用base30 属性来验证签名复杂性,而不仅仅是“最终用户是否画了一些东西?”。 x = $("#sigDiv").jSignature('getData', 'base30')[1].length > {insertValueHere} ? TRUE : FALSE。为了验证最终用户实际在框中签名并给出的不仅仅是一个简单的“。”小'​​x'。从base30 产生的第二个索引的返回值随着复杂度的增加而变大。因此,如果用户确实只输入了一个点, x = $("#sigDiv").jSignature('getData', 'base30')[1].length 大约是 5。最终用户在框中绘制的越多,产生的值就会变得越来越大。我在测试期间记录的最长长度是 2272。我在盒子里乱涂乱画了 15 秒。

    根据 jSig 文档:

    base30 (alias image/jSignature;base30) (EXPORT AND IMPORT) (VECTOR) 数据格式是一种基于 Base64 的压缩格式,针对荒谬的紧凑性和原生 url 兼容性进行了调整。它是将“原生”数据结构压缩成所有向量的紧凑字符串表示形式。

    image- 这是我在验证时会避免的选择。它在第二个索引位置生成一个带有长字符串的对象。我测量的最后一个是 672 个字符长。使用 image 会生成一个字符串,无论 sig 框是空白还是已使用。为了让事情变得更无用,Chrome verse 中的空白签名框与 FF Developer 中的空白签名框生成的字符串是不同的。我确定 image 值有用,但不能验证。

    svgbase64 - 这类似于image,但有例外。与image 不同,使用svgbase64 在第二个位置会产生一个长而短的字符串。此外,当我执行 Chrome verse FF Developer 检查时,这个字符串是相同的。这是我停止测试的地方。所以我假设你可以使用svgbase64 进行验证。

    这些是我的结论,你的可能会有所不同。请不要以我的低劣名声反对我。

    【讨论】:

    • 非常深入的回应。使用 [base30] 肯定可以更好地指示签名的复杂性。我确定了 75 的门槛。
    • $("#sigDiv").jSignature('getData', 'base30')[1].length 只为base30 提供0 其他格式如svgbase64 返回132
    【解决方案3】:

    根据jSignature website,API 中有一个getData 函数。如果您在空签名区域上使用getData 函数作为参考,则可以随时使用getData 并将其与空参考进行比较。然后你就可以知道签名区域是否写了一些东西。

    这只是我的猜测,因为我没有使用过这个脚本,但我认为这样的东西可以工作。

    编辑

    我也在the website上找到了这个

    初始化 jSignature 的 dom 元素发出 'change' 中风完成后立即将事件添加到存储中。 (换句话说,当用户完成绘制每个笔画时。如果用户绘制 3 笔画,每次笔画完成后都会发出 3 次此事件。)

    这是绑定到该事件的方式:

    $("#signature").bind('change', function(e){ /* 'e.target' will refer
    to div with "#signature" */ })
    

    事件通过“线程”( setTimeout(..., 3) )异步发出,因此您无需将事件处理程序包装到任何类型的“线程”中,因为 jSignature 小部件将继续运行并且不会正在等待您完成自定义事件处理程序逻辑。

    您不能设置一个标志变量,在第一个change 事件中设置为真吗?这表明 某物 被写入该区域

    【讨论】:

    • 我从过去 10 天开始挖掘它。 getData 如果画布为空,则返回一些垃圾数据。而且它的变化也不是恒定的值
    • 每次指定相同的数据格式,是否返回不同的数据?
    • 它总是返回是这样的,即使它空面板...'图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAABM4AAAGaCAYAAAD3rg8TAAAHuklEQVR4nO3BMQEAAADCoPVPbQZ / oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 跨度>
    • 好的,但最重要的部分是它是否总是在空时返回 same 数据?如果是这样,那么您可以将您的数据与“空”数据集进行比较。我他们不一样那么它不是空的
    • 即使它是空的,它也是不同的数据......这可能是画布问题
    【解决方案4】:

    如果有任何点,您可以检查 base30 向量。

    var isSignatureProvided=$sigdiv.jSignature('getData','base30')[1].length>1?true:false;
    

    【讨论】:

      【解决方案5】:

      这对我有用,部分使用 roch 代码: 它基本上在提交验证之前将签名分配给隐藏的文本区域:

      <div id="signatureparent">
      <div id="signature"></div>
      <label for='signature_capture' class='error'></label>
      </div>
      <span style="visibility:hidden;">
      <textarea name="signature_capture" class="required" id="signature_capture"></textarea> 
      </span> 
      
      
      <script>
      $(document).ready(function(){
      $('#submit').click(function() {
          var isSignatureProvided=$('#signature').jSignature('getData','base30')[1].length>1?true:false;
          if (isSignatureProvided) {
              var $sigdiv = $("#signature");
              var datapair = $sigdiv.jSignature("getData", "svgbase64");
              var data = $('#signature').jSignature('getData');
              $("#signature_capture").val(data);
          }
      });
      });
      </script>
      

      【讨论】:

        【解决方案6】:

        不幸的是,没有任何现有答案对我有用。在我的网站上,我有两种输入签名的方法:手动和 jSignature('importData', imgBase64) jSignature('getData', 'native') 的测试仅适用于手动绘图。图像方式没有任何效果。 解决方案似乎很简单。只需测试画布元素。它可能不适用于 IE9,但谁在乎呢。这是 TypeScript 中的内容:

        isSignatureBlank() {       
            var canvas = <any>$('#signatureElem').find("canvas")[0];
            if (!canvas) return true;
            this.emptyCanvas = this.emptyCanvas || document.createElement('canvas');
            this.emptyCanvas.width = canvas.width;
            this.emptyCanvas.height = canvas.height;
        
            return canvas.toDataURL() == this.emptyCanvas.toDataURL();
        }
        

        从这里采用:How to check if a canvas is blank?

        【讨论】:

          【解决方案7】:

          在您的 javascript 文件中搜索代码。检查他们何时隐藏“撤消笔划”块

          t.dataEngine.data.length
          

          这将帮助您确定签名面板的笔划次数。

          【讨论】:

            【解决方案8】:

            也许可以尝试这样的事情(假设您的签名字段属于“签名”类)...

            $('.signature').each(function (index) {
                var datapair = $(this).jSignature("getData", "svgbase64");
                if (datapair[1].length > 1000 ) {
                    // Signature is valid; do something with it here.
                }
            });
            

            【讨论】:

              【解决方案9】:

              最佳答案:

              if($sigdiv.jSignature('getData', 'native').length == 0) {
                alert('Please Enter Signature..');
              }
              

              产生以下错误:

              $sigdiv.jSignature(...) is undefined
              

              所以我建议使用:

              if(typeof($sigdiv.jSignature('getData', 'native')) != 'undefined') {
                alert('Please Enter Signature..');
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-06-06
                • 2022-11-29
                • 1970-01-01
                • 2011-06-26
                • 1970-01-01
                • 2012-09-26
                • 2010-10-01
                相关资源
                最近更新 更多