1

我正在使用 JSON 使用以下函数检索数据库中表包含的行数。

function rowCount()
{
    $.ajax({
        headers: { 
                'Accept': 'application/json',
                'Content-Type': 'application/json' 
            },
        datatype:"json",
        type: "GET",                    
        url: "/wagafashion/ajax/CmsRowCount.htm",
        success: function(response)
        {
            $("#rows").val(response);
        },
        error: function(e)
        {
            alert('Error: ' + e);
        }
    });
}            

在成功处理程序中,响应按预期到达。服务器端没有问题。

响应只是映射到long表示数据库表中行数的 Java 类型。

我将此响应放在成功处理程序idrows使用的隐藏字段中。$("#rows").val(response);

使用以下 jQuery 函数提交表单时会调用上述函数。

$(function() {
    $('#dataForm').submit(function() {

        rowCount();  //Invokes the above function that makes a JSON request.
        var rows=$("#rows").val();
        alert("rows = "+rows);

        return false;
    });
});

警告框尝试警告隐藏字段包含的值(即上文所述的 JSON 响应),但首次为空。只有当我再次按下提交按钮(没有页面刷新)时,它才会提醒实际值。


还尝试将前面的函数替换为以下函数。

$(function() {
    $('#dataForm').submit(function() {

        rowCount();  //Invokes the first function that makes a JSON request.     

        var form = $(this),
        url = form.attr('action'),
        rows = form.find('input[name="rows"]').val();

        alert("rows = "+rows);

        return false;
    });
});

但它也没有奏效。为什么会这样?将隐藏字段的正确值检索到前面的 jQuery 函数中的方法是什么?

4

1 回答 1

2

警告框尝试警告隐藏字段包含的值(即上文所述的 JSON 响应),但首次为空。

Ajax 调用是异步的。当您调用时rowCount,您开始调用,但随后rowCount返回并且您的代码继续。调用直到稍后才完成(这就是ajax接受回调的原因)。

如果您从回调触发下一步的操作,您将获得价值。您通常通过rowCount接受它自己的回调来做到这一点,如下所示:

function rowCount(callback)          // <==== Accept the callback
{
    $.ajax({
        headers: { 
                'Accept': 'application/json',
                'Content-Type': 'application/json' 
            },
        datatype:"json",
        type: "GET",                    
        url: "/wagafashion/ajax/CmsRowCount.htm",
        success: function(response)
        {
            $("#rows").val(response);
            callback();              // <==== Call the callback
        },
        error: function(e)
        {
            alert('Error: ' + e);
            callback();              // <==== Probably want to give it a value telling it things failed
        }
    });
}

然后使用它:

$(function() {
    $('#dataForm').submit(function() {
        var form = $(this); // <== Grab this outside the callback

        rowCount(function() {

            var url = form.attr('action'),
                rows = form.find('input[name="rows"]').val();

            alert("rows = "+rows);
        });

        return false;
    });
});

如果要根据回调决定是否允许提交表单,则必须始终取消提交,然后如果要允许,则从回调中以编程方式触发提交。

于 2013-02-02T21:00:14.970 回答