画布签名触摸在 phonegap 中产生问题

Posted

技术标签:

【中文标题】画布签名触摸在 phonegap 中产生问题【英文标题】:Canvas signature touch creates issue in phonegap 【发布时间】:2014-03-07 12:35:59 【问题描述】:

我发现了一些与“phonegap 画布签名”相关的帖子,但它们没有帮助。我有一些下拉框、文本框和一个签名字段。我想在 sqlite 数据库中插入这些字段。

我的数据库表创建如下所示:

tx.executeSql("CREATE TABLE IF NOT EXISTS parts(id INTEGER PRIMARY KEY AUTOINCREMENT,nr,productId,description,toolsVerified)");
tx.executeSql("CREATE TABLE IF NOT EXISTS costs(id INTEGER PRIMARY KEY AUTOINCREMENT,nr,date,starttime,endtime,reason,cost)");
tx.executeSql("CREATE TABLE IF NOT EXISTS sign(orderNr unique ,rapport,sign)");

像普通文本一样读取字段值,画布签名字段的下拉菜单就像

kundusSign = $("#mKundusskirt")[0];
kundensUnderSkrift = kundusSign.toDataURL();

插入数据的代码如下:

db
    .transaction(function(tx) 
        // for parts table
        tx
                .executeSql(
                        "insert into parts(nr,productid,description,toolsVerified) values(?,?,?,?)",
                        [ nr, productId, desc, tool ]);
        // for cost table
        tx
                .executeSql(
                        "insert into costs(nr,date,starttime,endtime,reason,cost) values (?,?,?,?,?,?)",
                        [ nr, date, startTime, endTime, reason, cost ]);

        // for sign table
        signQuery = 'UNION SELECT ' + nr + ", '" + rapport + "','"
                + kundensUnderSkrift + "'";
        tx
                .executeSql('insert or replace into "sign" SELECT "orderNr","rapport","sign"'
                        + signQuery);
    );

我包括sign plugin 用于签名。现在我的问题是,当我输入签名字段时,没有插入数据库字段。此外,当我尝试删除符号插入查询并放置符号时,其他两个表(成本和零件)值也不会插入。如果我没有触摸符号字段,则图像的所有值都已成功插入,插入 toDataurl() 格式。

我只在堆栈跟踪中得到了这个错误:

sqlite (23) not authorised.

请给出一些解决方案。

编辑: 我也试过这个:

tx.executeSql("insert into sign(orderNr,sign,rapport)values(?,?,?)",[nr,rapport,kundensUnderSkrift]);

【问题讨论】:

也许这个问题对***.com/q/17550272/1741542有帮助 【参考方案1】:

嗯,它可以来自很多地方。

首先,您是否在 android(2.3 或更低版本)上对其进行测试?如果是这样,那么问题很可能是Android默认浏览器不支持.toDataUrl(),这意味着它也无法在PhoneGap中运行。

所以首先我建议你做的是仔细检查你在 kundensUnderSkrift 中是否真的有一个字符串。

第二个有时 WebSql 可能会很棘手,所以为了安全起见,我将使用它来创建表:

tx.executeSql("CREATE TABLE IF NOT EXISTS sign(orderNr unique ,rapport,sign STRING)");

WebSql 更新似乎根本不起作用,因此请确保清除数据或卸载,而不是再试一次。

3rd 你的语句顺序看起来不对:

tx.executeSql("insert into sign(orderNr,sign,rapport)values(?,?,?)",[nr,rapport,kundensUnderSkrift]);

应该是:

tx.executeSql("insert into sign(orderNr,rapport,sign)values(?,?,?)",[nr,rapport,kundensUnderSkrift]);

如果在检查了所有 3 点后仍然无法正常工作,我会建议尝试以下 UGLY 方法:

tx.executeSql("insert into sign(orderNr,sign,rapport) values('"+nr+"','"+ kundensUnderSkrift+"','"+rapport+"');",[],function(tx,success)alert("ALL OK");,function(tx,error)alert(error.message););

您可以使用 console.log 代替 alert,但在移动设备上,我发现使用 alert 进行调试要容易得多。 (除了windows phone,默认不支持alert)。

如果这对你有帮助,请告诉我。

【讨论】:

我使用的是最新的 android 版本不是 2.3 并且 insert or replace 查询在我的另一个页面和 kundensUnderSkrift 中都可以正常工作b> 仅返回字符串值。感谢您的建议。【参考方案2】:

您确实应该将错误回调传递给transaction()executeSql() 方法——这将有助于调试开发中的数据库操作。您需要使用 alert() 以外的其他东西来处理生产中的错误。

db.transaction(function(tx) 
    // for parts table
    tx.executeSql(
        "insert into parts(nr,productid,description,toolsVerified) values(?,?,?,?)",
        [ nr, productId, desc, tool ],
        null, sqlError
    );

    // for cost table
    tx.executeSql(
        "insert into costs(nr,date,starttime,endtime,reason,cost) values (?,?,?,?,?,?)",
        [ nr, date, startTime, endTime, reason, cost ],
        null, sqlError
    );

    // for sign table
    tx.executeSql(
        'insert or replace into sign(orderNr,rapport,sign) values (?,?,?)'
        [nr, rapport, kundensUnderSkrift],
        null, sqlError
        );
, xactError);

function sqlError(tx, err) 
    alert("Statement failed: " + err.message);


function xactError(err) 
    alert("Transaction failed: " + err.message);

【讨论】:

我解决了我的问题...错误处理不是问题。感谢您的建议。 最终导致问题的原因是什么?您可以为您的问题添加答案,然后将其标记为已接受。 签名需要太多时间来阅读。插入后加载新页面,因此会产生错误。所以我写了 setTimeout 函数来重定向页面。

以上是关于画布签名触摸在 phonegap 中产生问题的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap:画布没有正确刷新

适用于所有设备的 Phonegap 通用签名捕获

我需要设法在触摸屏上获取用户签名

向单元格动态添加视图会在表格中产生问题

NaN 在 scikit-learn 中产生问题

在运行()中产生任务时Luigi中的TaskClassAmbigiousException