繁体   English   中英

AJAX请求后的JQuery确认对话框

[英]JQuery confirmation dialog after AJAX request

我需要在服务器端验证具有给定注册号的人是否已经在数据库中。 如果此人已经注册,那么我会正常进行程序流程。 但是,如果该号码尚未注册,那么我想显示一个确认对话框,询问运营商是否想要注册一个输入号码的新人,如果运营商回答是,那么该人员将在在提交的表格上通知的数字。

我试过了

服务器端(PHP):

if (!$exists_person) {
  $resp['success'] = false;
  $resp['msg'] = 'Do you want to register a new person?';
  echo json_encode($resp);
}

客户端:

function submit(){
  var data = $('#myForm').serialize();

  $.ajax({
      type: 'POST'
      ,dataType: 'json'
      ,url: 'myPHP.php'
      ,async: 'true'
      ,data: data
      ,error: function(response){
        alert('response');
      }
  });
  return false;
}

我甚至看不到警报,这就是我想要将确认对话框放在服务器端写的消息。 其他问题,如何重新提交附加操作员答案的整个表单,以便服务器可以检查答案是否为是注册这个新人?

编辑

我能够通过这种方式解决问题:

服务器端(PHP):

$person = find($_POST['regNo']);
if ($_POST['register_new'] === 'false' && !$person) {
    $resp['exists'] = false;
    $resp['msg'] = 'Do you want to register a new person?';
    die(json_encode($resp)); //send response to AJAX request on the client side
} else if ($_POST['register_new'] === 'true' && !$person) {
    //register new person
    $person = find($_POST['regNo']);
}

if($person){
    //proceed normal program flow
}

客户端:

function submit(e) {
    e.preventDefault();
    var data = $('#myForm').serialize();
    var ajax1 = $.ajax({
        type: 'POST'
        , dataType: 'json'
        , async: 'true'
        , url: 'myPHP.php'
        , data: data
        , success: function (response) {
            if (!response.exists && confirm(response.msg)) {
                document.getElementById('register_new').value = 'true'; //hidden input
                dados = $('#myForm').serialize(); //reserialize with new data
                var ajax2 = $.ajax({
                    type: 'POST'
                    , dataType: 'json'
                    , async: 'true'
                    , url: 'myPHP.php'
                    , data: data
                    , success: function () {
                        document.getElementById('register_new').value = 'false';
                        $('#myForm').unbind('submit').submit();
                    }
                });
            } else if (response.success) {
                alert(response.msg);
                $('#myForm').unbind('submit').submit();
            }
        }
    });
}

您的PHP似乎没有任何问题。

问题是(1)您正在错误回调中进行警报,并且您的请求没有失败,因此您看不到警报。 (2)您正在警告字符串'response'而不是变量response

值得注意的是,您应该使用.done().fail() promise方法( http://api.jquery.com/jquery.ajax/#jqXHR )。

这是固定的JS:

function submit() {

  var data = $('#myForm').serialize();

  // Same as before, with the error callback removed
  var myAjaxRequest = $.ajax({
    type: 'POST',
    dataType: 'json',
    url: 'myPHP.php',
    async: 'true',
    data: data
  });

  // The request was successful (200)
  myAjaxRequest.done(function(data, textStatus, jqXHR) {
    // The data variable will contain your JSON from the server
    console.log(data);
    // Use a confirmation dialog to ask the user your question
    // sent from the server
    if (confirm(data.msg)) {
      // Perform another AJAX request
    }
  });

  // The request failed (40X)
  myAjaxRequest.fail(function(jqXHR, textStatus, errorThrown) {
    console.log(errorThrown);
  });

  return false;
}

此外,您在PHP中设置'status'并在JS中检查(我推测)。 您要做的是从服务器设置HTTP状态代码,如下所示:

if (!$exists_person) 
{
    $resp['msg'] = 'Do you want to register a new person?';

    // 400 - Bad Request
    http_response_code(400);

    echo json_enconde($resp);
}

然后,jQuery将根据您回复的状态代码确定请求是否失败。 200是成功的请求, 400号码失败。

查看此页面以获取完整列表: https//httpstatuses.com/

好的,这是一个两部分的问题; 我会尽力回答这两个部分:

第1部分 :如何检测成功是否为假并触发确认弹出窗口?

在jQuery.ajax中,基于响应代码触发错误处理程序。 这可能不是你想要的。 您可以使用成功处理程序并测试值res.success以查看它是true还是false。 这将是:

function submit(e) {
  e.preventDefault();

  var data = $('#myForm').serialize();

  $.ajax({
    type: 'POST',
    dataType: 'json',
    url: 'myPHP.php',
    async: 'true',
    data: data
  }).done(function(res) {
    if (!res.success) {
      alert(res.msg);
    }
  });
}

第2部分 :如何通过确认重新提交?

使用我们之前的代码,我们将进行一些更改,允许submit()传递一个参数registerNew 如果registerNew为true,我们将它作为参数传递给PHP中的ajax处理程序,因此它知道我们想要注册一个新人。 Javascript看起来像这样:

function submit(e, registerNew) {
  if (e) e.preventDefault();

  var data = $('#myForm').serialize();
  var ajax_options = {
    type: 'POST',
    dataType: 'json',
    url: 'myPHP.php',
    async: 'true',
    data: data
  };

  ajax_options.data.register_new = !!registerNew;

  $.ajax(ajax_options).done(function(res) {
    if (!res.success && confirm(res.msg)) {
      submit(null, true);
    }
  });
}

正如您在此处看到的,我们在ajax选项中的数据中传递了一个新的register_new参数。 现在我们需要在PHP端检测到这一点,这很容易看起来像这样(这在你的php ajax处理程序中):

if ($_POST["register_new"]) {
  // new user registration code goes here
} else {
  // your existing ajax handler code
}

在提交功能中添加确认

function submit(){
  var data = $('#myForm').serialize();
if (confirm('Are you ready?')) {
  $.ajax({
      type: 'POST'
      ,dataType: 'json'
      ,url: 'myPHP.php'
      ,async: 'true'
      ,data: data
      ,error: function(response){
        alert('response');
      }
  });
 }
  return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM