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のタイプにマッピングされます。

この応答を、成功ハンドラーで使用してidいる隠しフィールドに入れています。rows$("#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 に答える