0

ニュースレターの登録フォームを用意しています。以下のjQueryスクリプトがあります。

$(document).ready(function(){  
$('#newsletter-signup').submit(function(){  

    //setup variables  
    var form = $(this),  
    formData = form.serialize(),  
    formUrl = form.attr('action'),  
    formMethod = form.attr('method'),   
    responseMsg = $('#signup-response');  

    //show response message - waiting  
    responseMsg.hide()  
               .addClass('response-waiting')  
               .text('Please Wait...')  
               .fadeIn(200);  

    //send data to server for validation  
    $.ajax({  
        url: formUrl,  
        type: formMethod,  
        data: formData,  
        success:function(data){  

            //setup variables  
            var responseData = jQuery.parseJSON(data),   
                klass = '';  

            //response conditional  
            switch(responseData.status){  
                case 'error':  
                    klass = 'response-error';  
                break;  
                case 'success':  
                    klass = 'response-success';  
                break;    
            }  

            //show reponse message  
            responseMsg.fadeOut(200,function(){  
                $(this).removeClass('response-waiting')  
                       .addClass(klass)  
                       .text(responseData.message)  
                       .fadeIn(200,function(){  
                           //set timeout to hide response message  
                           setTimeout(function(){  
                               responseMsg.fadeOut(200,function(){  
                                   $(this).removeClass(klass);  
                               });  
                           },3000);  
                        });  
             });  
          }  
    });  

    //prevent form from submitting  
    return false;  
});  
});

興味がある場合は、ここに私の PHP のスニペットを示します (DB 資格情報が削除されています)。

<?php 
if(isset($_GET['action'])&& $_GET['action'] == "signup"){  
mysql_connect(***REMOVEDforprivacy*******);  
mysql_select_db(***REMOVEDforprivacy*******);  

//sanitize data  
$email = mysql_real_escape_string($_POST['signup-email']);  

$to ='***REMOVEDforprivacy*******';
$subject = '***REMOVEDforprivacy*******';
$body = "The email address ". $email. " has been added to the email database.";
$headers = 'From: ***REMOVEDforprivacy*******' . "\r\n" .
            'Reply-To:  ***REMOVEDforprivacy*******' . "\r\n" .
            'X-Mailer:  PHP/' . phpversion();

//validate email address - check if input was empty  
if(empty($email)){  
    $status = "error";  
    $message = "You did not enter an email address!";  
}  
else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //validate email address - check if is a valid email address  
    $status = "error";  
    $message = "You have entered an invalid email address!";  
}  
else {  
   $existingSignup = mysql_query("SELECT * FROM signups WHERE email_address='$email'");  
   if(mysql_num_rows($existingSignup) < 1){  



       $insertSignup = mysql_query("INSERT INTO signups (email_address) VALUES ('$email')");  
       if($insertSignup){  
           $status = "success";  
           $message = "You have been signed up!";
            mail($to, $subject, $body, $headers);
       }  
       else {  
           $status = "error";  
           $message = "Oops, There has been a technical error!";  
       }  
    }  
    else {  
        $status = "error";  
        $message = "Looks like you have already registered this email address with us.  Thank you for your support!";  
    }  
}  

//return json response  
$data = array(  
    'status' => $status,  
    'message' => $message  
);  

echo json_encode($data);  

exit;  
}  


?>

ここまではすべてスムーズに機能します。

//show reponse message  
            responseMsg.fadeOut(200,function(){  
                $(this).removeClass('response-waiting')  
                       .addClass(klass)  
                       .text(responseData.message)  
                       .fadeIn(200,function(){  
                           //set timeout to hide response message  
                           setTimeout(function(){  
                               responseMsg.fadeOut(200,function(){  
                                   $(this).removeClass(klass);  
                               });  
                           },3000);  
                        });  
             });  

ここで何が悪いのかわかりません。構文は問題ないようですが、ほとんどを削除して使用しようとすると、responseMsg.fadeOut(200);responseMsg は消えません (そのため、クラスを削除して新しいクラスを追加することを忘れることができます)。私はこれを Firebug で検査しましたが、POST 応答は正しいエラーを示し、成功メッセージが返されています...(実際にデータベースをチェックすると、エントリが追加され、アラートメールが送信されます)......だからファンシーなシュナジーJQuery効果を除いて、すべてが機能しています。ページ上の別の要素からの JQuery の競合があると簡単に思ったので、それを削除しましたが、変更はありません。$.noconflict()、$.noconflict(true) を使用して、$ のすべてのインスタンスを JQuery に置き換えてみました (ただし、ページ上の他の項目は競合していませんでした)。「応答待機」クラスを追加する呼び出しを削除して、データの JSON 解析後に応答メッセージ クラスを追加しようとしましたが、うまくいきませんでした。この素晴らしいチュートリアルなので、なぜうまくいかないのか途方に暮れています。誰でも手がかりを得ましたか?

アップデート

FWIW ここにあるのはJSFiddleですが、PHP DB がないと絶対に機能しません....どうすればそれを回避できるかわかりません....

UPDATE 私のPHPコードをHTMLヘッダーの上に配置しないというばかげた間違い...許可され次第、回答として投稿します。

4

2 に答える 2

1

問題を再現するには、コードを削除する必要があることを意味しました。通常、問題を特定します。これは問題なく動作します (クリック時にイベントを発生させるだけでフォーム送信をシミュレートします):

http://jsfiddle.net/k8nhR/3/

$(document).ready(function(){  
    $('#signup-button').click(function(){  

        responseMsg = $("#signup-response");
                 //show response message - waiting  
         responseMsg.hide()  
                    .addClass('response-waiting')  
                    .text('Please Wait...')  
                    .fadeIn(200);  

        var responseData =  { status : "success", message: "success message"};
                var klass = '';

                //response conditional  
                switch(responseData.status){  
                    case 'error':  
                        klass = 'response-error';  
                    break;  
                    case 'success':  
                        klass = 'response-success';  
                    break;  
                }  

                //show reponse message  
                responseMsg.fadeOut(200,function(){  
                   $(this).removeClass('response-waiting')  
                          .addClass(klass)  
                          .text(responseData.message)  
                          .fadeIn(200,function(){  
                              //set timeout to hide response message  
                              setTimeout(function(){  
                                  responseMsg.fadeOut(200,function(){  
                                      $(this).removeClass(klass);  

                                  });  
                               },3000)  
                           });  
                });   
      });  
    });  

</p>

于 2012-07-23T20:56:23.483 に答える
0

コールバック関数で取得できるように、success 関数の前に Klass 変数を宣言する必要があります。setTimeout を使用する代わりに、.delay() を使用するだけです。

于 2012-07-23T20:45:23.727 に答える