Ajax 成功函数被忽略 - 代码仍在运行

Posted

技术标签:

【中文标题】Ajax 成功函数被忽略 - 代码仍在运行【英文标题】:Ajax Success Function Being Ignored - Code Still Runs 【发布时间】:2019-09-28 03:39:11 【问题描述】:

我正在尝试通过 AJAX 向黑猩猩邮件帐户发布一段。如果调用成功,我想重定向到一个 URL。经过多次测试,每次调用都是成功的,但我无法获得重定向......就好像代码运行然后跳过 if “result = success”,然后直接进入我的 else 语句,这只是一个警报。当我查看返回的数据时,我得到“nullsuccess”。我什至尝试过 if result = "nullsuccess" 并且它仍然适用于 else 语句。

$("#mc-embedded-subscribe-form").submit(function(e)    
    var url = $(this).prop('action'); // the script where you handle the form input.
        $.ajax(
            type: "POST",
            url: "update-member.php",
            data: $("#mc-embedded-subscribe-form").serialize(), // serializes the form's elements.
            dataType: "text",
            success: function(data)
                if(data.result == 'success')
                    window.location.href = 'https://google.com';
                else
                    alert("ERROR-ONLY IT STILL SUBMITS DATA!");
                
            
        );        
    e.preventDefault(); // avoid to execute the actual submit of the form.
);

以上数据类型 - 我使用了“文本”,因为如果我使用“json”或“jsonp”,它会完全忽略成功函数,包括 if 和 else 语句。有趣的是这三种数据类型仍然可以成功发布数据。

这里是 PHP(update-member.php)

$apikey = 'myAPIKEYHERE';
            $auth = base64_encode( 'user:'.$apikey );    
            $data = array(
                'apikey'        => $apikey,
                'email_address' => $_POST['email_address'],
                'status'        => 'subscribed',
                'merge_fields'  => array(

                )                   
            );

            $json_data = json_encode($data);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'MYMAILCHIMPURL');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Authorization: Basic '.$auth));
            curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);  

            echo json_encode($response_array);                                                                                                                

            $result = curl_exec($ch);
            $message = curl_errno($ch) === CURLE_OK ? 'success' : 'failure';
            echo $message; //echos nullsuccess

我觉得我没有从 update-member.php 返回一些东西,或者我没有在我的 ajax 成功函数中正确收集它。

【问题讨论】:

从 json_ecode($response_array) 中移除回显 在您的网络选项卡中检查响应,我认为您获得的不仅仅是成功 正如@AhmedSunny 指出的,您的PHP 是echoing 2 件事-echo json_encode($response_array); 和后来的echo $message;。所以你会得到 2 个连接的字符串,这就解释了nullsuccess 好的,所以我已经注释掉了除了 $message 之外的所有其他内容...返回成功。但是我在 ajax 脚本中的成功函数应该是什么样子?它仍然会跳过 if 成功并转到 else 警报。 @RyanRyan 我添加了答案。 【参考方案1】:

正如 cmets 中所讨论的,您的 PHP 正在回显 2 件事:

echo json_encode($response_array);
// ...
echo $message;

因此该脚本返回 2 个串联的字符串 - 这解释了您所看到的奇怪的 nullsuccess。去掉第一个echo,这样你就只返回一个纯文本状态字。

下一个问题在于您的 javascript。您已指定您的 AJAX 调用将返回一些文本:

dataType: "text",

事实上确实如此 - 纯文本 successfailure 状态消息。但是在使用该响应时,您的代码会将其视为 JSON:

if(data.result == 'success')

data 是您的纯文本响应/状态消息,它没有 .result 属性。它只是文本,因此将其更改为:

if(data === 'success')

更新

这是您的代码的简化工作版本。我在本地设置并验证它有效。我所做的唯一 事情就是我上面描述的——确保dataType 匹配PHP 返回的内容,并确保JS 在获取它时以这种方式对待它。在这种情况下,它一直是text

复制此代码并尝试一下。在您的电子邮件字段中输入“a@a.com”以测试成功响应,以及测试失败的任何其他内容。

Javascript

$("#mc-embedded-subscribe-form").submit(function(e)    
    e.preventDefault();
    $.ajax(
        type: "POST",
        url: "update-member.php",
        data: $("#mc-embedded-subscribe-form").serialize(),
        dataType: "text",  // <-- WE EXPECT TO GET TEXT BACK
        success: function(data) 
            // Check what your PHP returns, make sure no newlines
            console.log(data);
            if (data === 'success')   // <-- TREAT WHAT WE GOT AS TEXT
                window.location.href = 'https://google.com';
             else 
                alert("Error");
            
        
    );        
);

PHP

<?php
// The problems you are having are unrelated to the Mailchimp processing,
// so let's simplify it to get the JS side working.  Make sure you have 
// no blank lines before or after your opening/closing PHP tags, as 
// they will show up in the output, and your JS would then see something
// like "\nsuccess" for example.  Also make sure nothing else in your PHP
// generates any output.
// WE RETURN TEXT
echo ($_POST['email_address'] === 'a@a.com') ? 'success' : 'failure';
?>

如果您尝试这样做但它不起作用,那么您在某个地方遇到了另一个问题。打开浏览器的开发工具,然后检查控制台。查看网络请求并查看 POST。

解决您的一些 cmets:

您通过调整问题的随机不相关部分使事情变得过于复杂。在这个特定的问题中,您只需要对齐几个剩余部分(其他部分已经在工作):

1) 如果你告诉你的 JS 你的 PHP 将返回文本,它必须返回文本。

2) 如果您告诉您的 JS 您的 PHP 将返回文本,那么您的 JS 必须将您的 PHP 返回的内容视为文本。

就是这样。真的没什么。

GET 与 POST:convention and standards 是使用 GET 来检索和查看数据,并使用 POST 来更改数据。您正在订阅一个电子邮件地址 - 这是一个更改,您应该使用 POST。

GET 或 POST 对您的 PHP 返回的内容、它是否运行正常或您应该使用什么 dataType 没有、没有、零影响。它们是拼图中不相关的部分(尽管这并不意味着您使用什么无关紧要)。

【讨论】:

我试过这个并且整个成功函数没有运行......如果我将数据类型改回文本,我会收到警报。我可以让成功函数运行的唯一方法是如果数据类型设置为文本......我已经尝试过 json 和 jsonp,但我什么也没得到......但是请记住,脚本在更新记录。 :( @RyanRyan change the data type back to text - 嗯?您的代码已经将其作为文本。应该是文字。我没有建议改变它。我现在不确定你做了什么以及你在哪里。仔细检查我上面的建议并告诉我。 另外,正如我在回答中所描述的,dataType 指定了您的 JS 应该从您的 PHP 中得到什么。它与 PHP 是否可以工作无关——所以是的,无论你放什么,你的 PHP 都会运行良好。 @RyanRyan 这有意义吗? dataType 以及如何使用 data 有几个选项,但它们需要匹配。如果将dataType 保留为text,则需要使用(data === 'success'),仅此而已。你试过吗?如果您将dataType 切换为json,您将需要更改您的 PHP 以返回 JSON,并更新 AJAX 成功函数以测试您的新 JSON 响应,例如您最初的响应(但您的 PHP需要返回这个确切的 JSON 格式/消息):(data.result == 'success'). 如果我将其更改为 GET,并将数据类型更改为“json”,一切正常。如果我尝试将 POST 与 dataType json 一起使用,我什么也得不到,甚至没有 else 警报语句。我相信问题是我正在寻找关于 POST 的成功声明,而我实际上是在运行 GET 声明。如果我在 dataType 为文本时检查状态值是否为已订阅,则它会在返回“已订阅”作为字符串时起作用。我的 PHP 文件返回这个: $json = json_decode($result);回声 $json->'status';如果(状态==“订阅”); // 有效【参考方案2】:

那是因为你可能没有设置 result = success。默认情况下,它已经在成功功能中。您必须在服务器端进行如下设置。

$data['result'] = 'success';

在 ajax 中你必须将 dataType 设置为 'json'

$("#mc-embedded-subscribe-form").submit(function(e)    
    var url = $(this).prop('action'); // the script where you handle the form input.
        $.ajax(
            type: "POST",
            url: "update-member.php",
            data: $("#mc-embedded-subscribe-form").serialize(), // serializes the form's elements.
            dataType: "json", //CHANGED
            success: function(data)
                if(data.result == 'success')
                    window.location.href = 'https://google.com';
                else
                    alert("ERROR-ONLY IT STILL SUBMITS DATA!");
                
            
        );        
    e.preventDefault(); // avoid to execute the actual submit of the form.
);

【讨论】:

添加这个 $data['result'] = 'success';到php文件没有做任何事情,它仍然跳过成功函数中的if语句。 你把dataType改成json了吗??

以上是关于Ajax 成功函数被忽略 - 代码仍在运行的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 帖子的成功部分无法在完整日历代码中运行

UI 未加载,代码仍在运行

Yarn 显示作业已成功,但 EMR 显示该步骤仍在运行

`tap` 函数如何被忽略?

Rails ajax 表单发送电子邮件但不在“成功”下运行代码

Ajax POST 成功,但 sql 查询未运行