3

ajaxリクエストでメールを送信するためのjquery関数があります。

function sendMail(from,to,subject,message){
    var datastr="from="+from+"&to="+to+"&subject="+subject+"&message="+message;
    $.ajax({
        type: "POST",
        url: "mail.php",
        data: datastr,
        cache: false,
        success: function(html){
            return true;
        },
        error: function(jqXHR,status,error){
            return false;
        }
    });
}

ここで、メールが正常に送信されたかどうかをユーザーに通知します。

$("#feedback").html("Sending email...");
if(sendMail("from@email.com","to@email.com","MySubject","MyMessage"))
   $("#feedback").html("Email sent.");
else
   $("#feedback").html("Error sending email.");

しかしもちろん、jQueryはメールが送信される前にif条件を処理するため、条件はfalseです:-( sendMailが完了して何かを返すまで待つようにjQueryに指示するにはどうすればよいですか?

4

3 に答える 3

8

与えられた答えは有効ですが、sendmail関数とDOMの変更を別々に保つことを検討します(つまり$("#feedback").html...success/errorコールバックを避けます)。ajaxこれを行うには、呼び出しの結果を返します。

function sendMail(from,to,subject,message){
    var datastr="from="+from+"&to="+to+"&subject="+subject+"&message="+message;
    return $.ajax({
        type: "POST",
        url: "mail.php",
        data: datastr,
        cache: false
    });
}

戻り値は Promise インターフェイスを実装しているため、次のようにできます。

$("#feedback").html("Sending email...");
sendMail("from@email.com","to@email.com","MySubject","MyMessage")
    .done(function(){
        $("#feedback").html("Email sent.");
    })
    .fail(function(){
        $("#feedback").html("Error sending email.");
    });

successフィールドとフィールドは必要ないため ajax 呼び出しから削除しましたerrorが、ロギングなど他の目的で必要な場合は引き続き使用できます。

于 2012-07-01T16:31:32.243 に答える
0
$("#feedback").html("Sending email...");
$.ajax({
    type: "POST",
    url: "mail.php",
    data: datastr,
    cache: false,
    success: function(html){
       if (sendMail("from@email.com","to@email.com","MySubject","MyMessage")) {
          $("#feedback").html("Email sent.");
       } else {
          $("#feedback").html("Error sending email.");
       }
    },
    error: function(jqXHR,status,error){
        $("#feedback").html("Error sending email.");
    }
});

sendMail が何かわかりませんが、それが電子メールが送信されたかどうかを確認するためのチェックである場合は、それでよろしいですか?

于 2012-07-01T16:24:26.403 に答える
0

関数が AJAX 呼び出しの結果に基づいて true/false を返すことはできませんsendMail(同期要求を使用しない限り、ほとんどの場合ひどい考えです)。これは、ブラウザーで JavaScript が機能する方法にすぎません。正当な理由により、ここでは説明しません。

代わりに、$.ajax成功または失敗した場合でも何をすべきかを伝える必要があります。

これを行う 1 つの方法は次のようになります。

$.ajax({
  // omitting arguments for clarity
  success: function(){
    $("#feedback").html("Email sent.");
  },
  error: function(){
    $("#feedback").html("Error sending email.");
  }
});
于 2012-07-01T18:02:16.977 に答える