javascript – 如何从AJAX提交的表单中获取响应?

前端之家收集整理的这篇文章主要介绍了javascript – 如何从AJAX提交的表单中获取响应?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想使用Acymailing Joomla!在example.com/mailer上安装的组件,用于管理example.com上非Joomla站点订阅

在那种情况下,我有简单的脚本

 $(function () {
    $('form').on('submit',function (e) {
      e.preventDefault();
      $.ajax({
        type: 'post',url: 'https://example.com/mailer/index.PHP?option=com_acymailing&ctrl=sub',data: $('form').serialize(),success: function () {
          swal('Great success!');
        }
      });
    });
  });

和形式

PHP?option=com_acymailing&ctrl=sub" method="post">

一切正常,除了成功,错误状态……

Joomla Acymailing有sub.PHP文件来处理ajax响应

 if($config->get('subscription_message',1) || $ajax){
        if($allowSubscriptionModifications){
            if($statusAdd == 2){
                if($userClass->confirmationSentSuccess){
                    $msg = 'CONFIRMATION_SENT';
                    $code = 2;
                    $msgtype = 'success';
                }else{
                    $msg = $userClass->confirmationSentError;
                    $code = 7;
                    $msgtype = 'error';
                }
            }else{
                if($insertMessage){
                    $msg = 'SUBSCRIPTION_OK';
                    $code = 3;
                    $msgtype = 'success';
                }elseif($updateMessage){

                    $msg = 'SUBSCRIPTION_UPDATED_OK';
                    $code = 4;
                    $msgtype = 'success';
                }else{
                    $msg = 'ALREADY_SUBSCRIBED';
                    $code = 5;
                    $msgtype = 'success';
                }
            }
        }else{
            if($modifySubscriptionSuccess){
                $msg = 'IDENTIFICATION_SENT';
                $code = 6;
                $msgtype = 'warning';
            }else{
                $msg = $modifySubscriptionError;
                $code = 8;
                $msgtype = 'error';
            }
        }

        if($msg == strtoupper($msg)){
            $source = acymailing_getVar('cmd','acy_source');
            if(strpos($source,'module_') !== false){
                $moduleId = '_'.strtoupper($source);
                if(acymailing_translation($msg.$moduleId) != $msg.$moduleId) $msg = $msg.$moduleId;
            }
            $msg = acymailing_translation($msg);
        }

        $replace = array();
        $replace['{list:name}'] = '';
        foreach($myuser as $oneProp => $oneVal){
            $replace['{user:'.$oneProp.'}'] = $oneVal;
        }
        $msg = str_replace(array_keys($replace),$replace,$msg);

        if($config->get('redirect_tags',0) == 1) $redirectUrl = str_replace(array_keys($replace),$redirectUrl);

        if($ajax){
            $msg = str_replace(array("\n","\r",'"','\\'),array(' ',' ',"'",'\\\\'),$msg);
            echo '{"message":"'.$msg.'","type":"'.($msgtype == 'warning' ? 'success' : $msgtype).'","code":"'.$code.'"}';
        }elseif(empty($redirectUrl)){
            acymailing_enqueueMessage($msg,$msgtype == 'success' ? 'info' : $msgtype);
        }else{
            if(strlen($msg)>0){
                if($msgtype == 'success') acymailing_enqueueMessage($msg);
                elseif($msgtype == 'warning') acymailing_enqueueMessage($msg,'notice');
                else acymailing_enqueueMessage($msg,'error');
            }
        }
    }

并且JSON看起来像Joomla一样通过index.PHP注册到同一个表单?option = com_acymailing& ctrl = sub

 message    Subscribe confirmed
 type   success
 code   3

 {"message":"Subscribe confirmed","type":"success","code":"3"}

问题是:如何在外部提交表单(在example.com页面上)获取提交状态成功,错误,已经下限等?

最佳答案
我不觉得你的ajax有问题,我可以从Joomla PHP代码中看到,每次当你请求joomla URL时,你总是得到一个响应头状态代码为200,所以你的javascript将永远落在ajax的成功块上代码,返回一些基于json的消息,当我检查该控制器的joomla acymaling(版本5.8.1 for joomla 3.8.3)代码时,我在第74行看到他们正在检查请求是否是使用ajax进行的,但是丢失了PHP标头中的Access-Control-Allow-Origin会限制您的外部呼叫,因此您可以在以下情况下替换此条件:

if($ajax){
    @ob_end_clean();
    header("Content-type:text/html; charset=utf-8");
}

if($ajax){
    @ob_end_clean();
    header("Content-type:text/html; charset=utf-8");
    header("Access-Control-Allow-Origin: *");
}

所以允许来自任何其他域的调用,但请记住这也可能导致您的joomla代码漏洞.您还需要更改HTML表单以及在HTML中添加一个隐藏字段:

所以允许你的joomla控制器文件的ajax请求.

现在在你成功的ajax块中,你可以检查这样的事情:

success:function(data,status,xhr){
    var json = $.parseJSON(data);
    swal(json.message,json.type);
}

我希望这能帮助你完成你想要的,快乐的编码.

猜你在找的jQuery相关文章