1

php ajaxでフォームを送信したいので、シンプルにしようと思っているのですが、どうしても複雑になってしまいます。

pageA.phpはただの形です。

pageB.phpコードを検証して処理しています。私が作成$_SESSION['message'] = "";したこのページの上に、何か問題がある場合は、ページの最後にある可能性があります$_SESSION['message'] = "Password is too short";-たとえば。pageA.phpこのメッセージをdiv 内に表示したい#message

セッションは両方のページの上で開始されます ( には、デフォルトで非表示になっているスピナー gif もあります ( session_start();
)が、フォームの処理中 (および処理中) に表示されるはずです。 pageAdisplay:none;

pageA.php

<form id="formReg" action="pageB.php" method="post">
. . .  
</form>
<img id="spinn" src="spinn.gif" />
<div id="message"></div>
<button id="sub">Register</button>

の下部にある JS pageA:

$("#sub").click( function() {
    $("#spinn").show(); // it seems this works, but very shortly
    $.post( $("#formReg").attr("action"), $("#formReg").serialize()); // this works (data are stored in the table).
    $("#formReg :input").val(''); //this works
    $("#spinn").hide();
    $("#message").html($_Session["message"]); // doesn't work, of course.
});

pageB.phpI have:の下部に、
header("Location: pageA.php");訪問者を維持するための がありpageAます。

4

1 に答える 1

2

最初: フォームの送信後に発生するすべてのアクションは、 に渡されるコールバック関数に配置する必要があります$.post()。AJAX 関数はすぐに戻るため、スピナーは表示された直後に非表示になります。次のようにします。

$.post(
    $("#formReg").attr("action"), $("#formReg").serialize(), 
    function(data, textStatus, jqXHR) {
        $("#spinn").hide();
        // Message display code - see below
    }
);

そうすれば、コールバック関数のコードは、コールが返された後ではなく、ポスト リクエストが返されるとすぐに実行され$.postます (これは単にリクエストを開始し、その完了を待ちません)。

メッセージの表示について: pageB.phpAJAX 経由でのみ呼び出されるため、リダイレクトする必要はありません。したがって、クライアントのブラウザーはpageA.php、開いた後に離れることはありません。AJAX 呼び出しは別個の HTTP 要求であり、現在開いているページには影響しません。値を返すには、単純に出力する必要があります。上で定義したコールバック関数pageBのパラメーターに値が含まれます。dataシンプルに保ちたい場合は、次のようにします。

// in pageB.php
echo $_SESSION['message'];

// In your JS callback
function(data, textStatus, jqXHR) {
    // "data" contains the output of pageB.php
    $("#message").html(data);
}

AJAX コールバックに複数のアイテムを渡す必要がある場合は、JSONを参照してください。

于 2013-01-13T03:32:25.043 に答える