3

私は PHP にはかなり強いのですが、javascript はまったく初めてです。

フォームの検証など、プロジェクトにさまざまな ajax 機能を追加する必要があります。

私はいくつかの検索を行い、いくつかのチュートリアルを見て、次のような基本的な作業例を考え出しました:

index.php:

<!DOCTYPE html>
<html lang="en">
<head>

<title>Ajax form test</title>

<style>
    form input, form textarea {
        display:block;
        margin:1em;
    }

    form label {
        display:inline;
    }

    form button {
        padding:1em;
    }
</style>
</head>
<body>

<h2>CONTACT FORM</h2>

<div id="form_content">
    <form method="post" action="server.php" class="ajax">

            <label for="name" value="name">name:</label>
            <input type="text" name="name" placeholder="name" />

            <label for="email" value="email">email:</label>
            <input type="email" name="email" placeholder="email" />

            <label for="message" value="message">message:</label>
            <textarea name="message" placeholder="message"></textarea>

            <input type="submit" value="send">

    </form>
</div>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="main.js"></script>

</body>
</html>

main.js:

$('form.ajax').on('submit', function() {

console.log('trigger');

var that = $(this),
    url = that.attr('action'),
    type = that.attr('method'),
    data = {};

    that.find('[name]').each(function(index, value) {
        var that = $(this),
            name = that.attr('name'),
            value = that.val();

        data[name] = value;
    });

$.ajax ({

    url:    url,
    type:   type,
    data:   data,
    success: function(response) {
        console.log(response);
        $('#form_content').load('server.php', data);
    }

});

return false;
});

最後に、server.php:

<?php

if (isset($_POST) AND $_POST['name'] !='' AND $_POST['email'] !='' AND $_POST['message'] !='')
{
?>
<h4>Your data was submitted as follows</h4>

<br />name: <?=$_POST['name']?>
<br />email: <?=$_POST['email']?>
<br />message: <?=$_POST['message']?>

<?php
} else {
?>
<h3>please fill in all form data correctly:</h3>

<form method="post" action="server.php" class="ajax">

        <label for="name" value="name">name:</label>
        <input type="text" name="name" placeholder="name" />

        <label for="email" value="email">email:</label>
        <input type="email" name="email" placeholder="email" />

        <label for="message" value="message">message:</label>
        <textarea name="message" placeholder="message"></textarea>

        <input type="submit" value="send">

</form>

<?php
}

すべてのフォーム データを入力して [送信] をクリックすると、ajax マジックが発生し、データの確認が得られるという点で、これはすべて正常に機能します。また、すべてのデータがロードされていない場合、フォームはページに再表示されます。問題は、このような場合、フォーム データを入力して送信し続けると、フォーム データが有効になるまで ajax 呼び出しを繰り返す代わりに、server.php ページが読み込まれることです。

これは私の最初の試みなので、これを行うためのより良い方法があると確信していますが、ここまたはグーグルで検索しても解決策を見つけることができませんでしたが、それはおそらく何を検索すればよいか本当にわからないためです.為に。フォームが正しく送信されるまで、最初のインスタンスの動作を繰り返し可能にするにはどうすればよいですか?

4

2 に答える 2

3

これはform、呼び出し中に要素を削除load()し、フォームの新しいバージョンで上書きするために発生します。したがって、アタッチされているすべてのイベント ハンドラーは、それと共に消えます。

変更されない要素でデリゲートを使用する必要があります。

$('#form_content').on('submit', 'form.ajax', function() {...});

説明:

上記の例では、イベント リスナーを#form_content要素にアタッチします。ただし、イベントからバブルアップするイベントのみをリッスンしますform.ajax submit。を新しいバージョンに置き換えるformと、既存のハンドラーはチェーンの上位 (置き換えられない要素) にアタッチされ、変更されたかどうかに関係なく、下位の要素からのイベントをリッスンし続けます。 ..したがって、引き続き機能します。

于 2013-09-13T17:01:58.723 に答える
0

あなたの主な問題は、クライアント側で実際にフォームを検証する必要があるときに、PHP 側でフォームを検証していることです。適切な応答を返し、クライアント側で処理を続行する代わりに、PHP 側で処理を終了しています。 . スティーブの答え(上記)は、あなたが見ているものに当てはまります。

あなたがとったアプローチに関しては、<form>AJAX を使用する必要がないことが多いため、構造をまったく使用しない方がよい場合があります。私の意見で<form>は、AJAX の時代にはあまり必要とされない古風な構造です。デフォルトのフォーム機能return falseを中止するために、AJAX ブロックの後にどのように追加しなければならなかったかに注意してください。それはあなたに何かを伝えるはずです。server.php

これを構造化する別の方法を次に示します。

HTML:

<body>

<h2>CONTACT FORM</h2>

<div id="form_content">
    <label for="name" value="name">name:</label>
    <input type="text" name="name" placeholder="name" />

    <label for="email" value="email">email:</label>
    <input type="email" name="email" placeholder="email" />

    <label for="message" value="message">message:</label>
    <textarea name="message" placeholder="message"></textarea>

    <input type="button" id="mybutt" value="send">
</div>
<div id="responseDiv"></div>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="main.js"></script>

</body>

JAVASCRIPT/JQUERY:

$(document).ready(function() {

    //Next line's construction only necessary if button is injected HTML
    //$(document).on('click', '#mybutt', function() {

    //Otherwise, use this one:
    $('#mybutt').click(function() {
        console.log('trigger');

        var valid = "yes";

        var that = $(this),
            url = "server.php",
            type = "POST",
            data = {};

        that.find('[name]').each(function(index, value) {
            var that = $(this),
                name = that.attr('name'),
                value = that.val();
                if (value=="") valid = "no";

            data[name] = value;
        });

        if (valid == "yes") {
            $.ajax ({
                url:    url,
                type:   type,
                data:   data,
                success: function(response) {
                    console.log(response);

                    $('#responseDiv').html(response);

                    /* OPTIONALLY, depending on what you make the PHP side echo out, something like:

                    if (response == "allgood") {
                        window.location.href = "http://www.google.com";
                    }else{
                        //this is how you would handle server-side validation
                        alert('Please complete all fields');
                    }

                    */
                }
            }); //END AJAX
        }else{
            alert('Please complete all fields');
        }

    }); //END button.click


}); //END document.ready

PHP 側: server.php

<?php

    if (isset($_POST) AND $_POST['name'] !='' AND $_POST['email'] !='' AND $_POST['message'] !='') {
        $r = '';
        $r .= "<h4>Your data was submitted as follows</h4>";
        $r .= "<br />name: " . $_POST['name'];
        $r .= "<br />name: " . $_POST['email'];
        $r .= "<br />name: " . $_POST['message'];

    } else {

        $r = "Please complete all form fields";

    }

    echo $r;
于 2013-09-13T17:44:02.720 に答える