与表单提交或window.location组合使用时,Web sql事件未完成



Heyo,

基本工作流程:

  • 单击表单提交按钮
  • 捕获提交事件
  • Capture函数运行回调脚本
    • 如果脚本返回false,则调用preventDefault((
    • ELSE表格提交

以上都很好。我只是为上下文提供了它。我遇到的问题是,作为回调脚本的一部分,会触发一系列SQL UPDATE事件

function writeNewProductDetails() {
    for(var i = 0; i < $('#productForm').children('input').length; i++) {
        var input = $('#productForm').children('input')[i];
        var inputType = $(input).attr('id').split('---');
        var inputVal = $(input).val();
        switch(inputType[1]) {
            case 'quantity' :
                localDB.webdb.runSQL('UPDATE orderLines SET "collected" = "'+inputVal+'" WHERE orderLineID = '+inputType[0])
                break;
            case 'code' :
                localDB.webdb.runSQL('UPDATE orderLines SET "code" = "'+inputVal+'" WHERE orderLineID = '+inputType[0])
                break;
        }
    }
    window.location(history(-1));
    return false;
}

现在很多代码与这个问题无关,关键部分是switch语句和下面的两行。window.location和return false命令用于避免实际提交表单(因为处理已经完成(。

这是问题的症结所在。如果我对window.location(history(-1((命令进行注释,并且函数返回false(即停止页面提交(,那么web sql命令就会启动并按预期运行。如果我把它留在里面,那么在sql命令完成处理之前,窗口似乎就移走了。这意味着数据库不会更新。

这类问题是已知的问题吗?是否有"最佳实践"来处理它?我无法想象在表单提交中使用web sql后端是一个完全陌生的概念?

---编辑---

最后,我采用了以下解决方案,它不是世界上最漂亮的,但它很有效。

  • 首先,我定义了一个全局变量var queryCountWNPD = 0;,wnpd代表writeNewProductDetails
  • 然后,每当发送查询(即queryCountWNPD++; \ localDB.webdb.runSQL('UPDATE orderLines...(时,我都会增加变量
  • 之后,我向sql命令detailsWritten添加了一个回调函数
  • 此函数(如下(递减queryCountWNPD,然后检查它是否等于0。如果是,则运行原始window.history.go(-1(命令。

    function detailsWritten() {
        queryCountWNPD--;
        if(queryCountWNPD == 0) {
            window.history.go(-1);
        }
    }
    

下面的答案值得称赞,因为它为我指明了正确的方向。

有趣的问题。看起来您遇到了并发问题。JS解析器似乎没有等待runSQL完成,然后再转到下一条语句。在这一点上,JS继续执行,直到你点击window.location,它会立即从历史记录中加载一个页面,你就会失去上下文。这也意味着,我不认为你的返回是错误的,因为window.location就像一个中断,它会立即启动。

还要注意,控制语句(for、switch、if等(不会在JavaScript中增加堆栈。我不知道这是怎么回事,但我有一种有趣的感觉,这可能很重要。

看看你是否可以把window.location放在这个函数之外,可以说是放在堆栈的更高位置。因此,让这个函数返回false,然后在调用者中,如果返回false,则返回window.location(history(-1((。函数确实会增加堆栈,因此解析器可能会等到所有调用完成后才"关闭"该堆栈级别。

最新更新