3

これはそれほど難しいことではないと確信しています。次の関数 onsubmit を実行するフォームがあります。

function FORMVALIDATE_add_rota_entry() {
    var rota_date = $("#rota_date").val();
    var rota_id = $("#rota_id").val();
    var am_pm = $("#am_pm").val();
    if(rota_date == "")
    {
        alert("Please enter a date.");
        return false;
    }
    if(rota_id == "error")
    {
        alert("Please select a rota from the list.");
        return false;
    }
    // check if that rota has already been entered for that date and am/pm
    $.ajax({
        async:false,
        type:"POST",
        url:"/modules/rotas/check_rota_entry_existence",
        data:{rota_date:rota_date, rota_id:rota_id, am_pm:am_pm},
        success: function(result) {
            if(result != "0")
            {
                alert("This rota has already been added to this date, "+am_pm+".");
                return false;
            }
        }
    });
}

次のように form タグで呼び出されます。

onsubmit="return FORMVALIDATE_add_rota_entry();"

そして、最初の 2 つの rota_date と rota_id で正常に動作し、必要なときにアラートが表示され、フォームの送信が停止しますが、ajax 呼び出しに到達すると正常になり、正しい結果が返され、アラートが発生したときにアラートが表示されます。すべきですが、 false を返すことでフォームの送信が停止しているようには見えません。私は困惑しているので、誰かアイデアはありますか?

ありがとう!

4

5 に答える 5

6

あなたはそれを間違ってやっています。あなたがそれをしている方法では、関数が常にfalseを返すようにする必要があります:

function FORMVALIDATE_add_rota_entry() {
    var rota_date = $("#rota_date").val();
    var rota_id = $("#rota_id").val();
    var am_pm = $("#am_pm").val();
    if(rota_date == "")
    {
        alert("Please enter a date.");
        return false;
    }
    if(rota_id == "error")
    {
        alert("Please select a rota from the list.");
        return false;
    }
    // check if that rota has already been entered for that date and am/pm
    $.ajax({
        async:false,
        type:"POST",
        url:"/modules/rotas/check_rota_entry_existence",
        data:{rota_date:rota_date, rota_id:rota_id, am_pm:am_pm},
        success: function(result) {
            if(result != "0")
            {
                alert("This rota has already been added to this date, "+am_pm+".");
                return false;//this is called when the server responds....which in your case isnt happening in the first place

            }
        }
    });

    return false;//this should be at the end so 'false' is always returned to 'onsubmit'
}

ifステートメントの唯一の目的はreturn false;、ajaxコードの実行を防ぐために役立ちます。ただし、関数の最後にも1つあるはずです。これは、次のように簡単に修正できるはずです。

onsubmit="FORMVALIDATE_add_rota_entry();return false;"

于 2012-08-26T00:03:44.500 に答える
1

削除する:

onsubmit="return FORMVALIDATE_add_rota_entry();"

関数の下に追加します(my-formフォームのIDはどこにありますか):

$('#my-form').submit(FORMVALIDATE_add_rota_entry);

変化する:

function FORMVALIDATE_add_rota_entry() {

に:

function FORMVALIDATE_add_rota_entry(event) {

そしてあなたの機能の変化で:

return false;

event.preventDefault();

ajaxリクエストは非同期であり、内部のコードはフォームプロセスを停止するのに間に合わないため、これによってフォームの送信が常に停止するわけではありません。

于 2012-08-26T00:08:19.943 に答える
1

わかりましたので、上記の解決策を試した後、絶対的な成功はありませんでした。フォーム要素を完全に捨てて、以下のように onclick に 3 つの値を送信しました。

 onclick="FORMVALIDATE_add_rota_entry($('#rota_date').val(), $('#rota_id').val(), $('#am_pm').val());"

すると、関数は次のようになりました。

function FORMVALIDATE_add_rota_entry(rota_date, rota_id, am_pm) {
    // check if that rota has already been entered for that date and am/pm
    $.ajax({
        type:"POST",
        url:"/modules/rotas/check_rota_entry_existence",
        data:{rota_date:rota_date, rota_id:rota_id, am_pm:am_pm},
        success: function(result) {
            if(result != "0")
            {
                alert("This rota has already been added to this date, "+am_pm+".");
            }
            else if(rota_date == "")
            {
                alert("Please enter a date.");
            }
            else if(rota_id == "error")
            {
                alert("Please select a rota from the list.");
            }
            else
            {
                $.post('/modules/rotas/add_rota_entry2', {rota_date:rota_date, rota_id:rota_id, am_pm:am_pm});
                parent.$.fn.colorbox.close();
            }
        }
    });
}

すべてが正常に機能します。

みんなの意見をありがとう:) }

于 2012-08-27T11:13:34.777 に答える
0

使用するのではなく

onsubmit="return FORMVALIDATE_add_rota_entry();"

使ってみて

onclick="return FORMVALIDATE_add_rota_entry();"

return true;関数の最後に追加する必要がある場合があります。

于 2013-10-09T15:01:23.153 に答える
0

ステートメントevent.preventDefault()の直前で使用してみてください。return

于 2012-08-25T23:53:55.627 に答える