如何调试 jquery AJAX 调用?

Posted

技术标签:

【中文标题】如何调试 jquery AJAX 调用?【英文标题】:How do I debug jquery AJAX calls? 【发布时间】:2014-03-20 18:45:38 【问题描述】:

我一直在努力让 AJAX 与 Jquery 一起工作。到目前为止,我最大的问题是我真的不知道如何找出我在哪里犯了错误。我真的没有调试 AJAX 调用的好方法。

我正在尝试设置一个管理页面,其中我想要执行的功能之一是更改我的 SQL 数据库中设置的权限。我知道 .click 函数正在被触发,所以我缩小了范围,但我不确定从 AJAX 调用到 SQL 查询的链中哪里出错了。

我的 .js 代码:

$('#ChangePermission').click(function()
    $.ajax(
        url: 'change_permission.php',
        type: 'POST',
        data: 
        'user': document.GetElementById("user").value,
        'perm': document.GetElementById("perm").value
        
    )
)

我的 .php 处理程序:

<?php  
require_once(functions.php);

echo $_POST["user"];

try
    $DBH = mysql_start();

    $STH = $DBH->prepare("INSERT INTO people ( username, permissions ) values (?, ?)");

    $STH->bindParam(1, $_POST["user"]);
    $STH->bindParam(2, $_POST["perm"]);

    $STH->execute();

catch(PDOException $e)
    echo $e->getMessage;
?>

mysql_start 是为我在其他 SQL 调用中成功使用的 PDO 函数设置的。

我这几天一直在研究和查找教程,但我终生无法弄清楚出了什么问题。是否有工具可以用来找出错误发生的位置?我显然对这个特定问题的答案很感兴趣,但我认为我在这里更大的问题是我不知道从哪里开始调试。感谢您的帮助!

【问题讨论】:

require_once('functions.php');? 看看这篇文章是否有帮助:***.com/questions/6991306/… 首先,你的$_POST["user"]真的有价值吗? 为 ajax 调用设置成功和错误处理程序,并将日志记录在两者中。然后你可以看到发生了什么。 在 IE 中使用 F12,Network Sniffer。 或者当今所有浏览器中嵌入的网络嗅探器。但您实际上可能会问如何跟踪 Ajax 调用的结果,而不是调试它... 【参考方案1】:

使用 Chrome 开发工具回答 2020 年

调试任何 XHR 请求

    打开 Chrome 开发工具 (F12) 在控制台中右键单击您的 Ajax url

对于 GET 请求

点击在新标签页中打开

对于 POST 请求

    点击在网络面板中显示

    网络面板中:

      点击您的请求

      点击回复标签查看详情

【讨论】:

【参考方案2】:

通过添加这样的成功和错误回调使您的 JQuery 调用更加健壮:

 $('#ChangePermission').click(function() 
     $.ajax(
         url: 'change_permission.php',
         type: 'POST',
         data: 
             'user': document.GetElementById("user").value,
             'perm': document.GetElementById("perm").value
         ,
         success: function(result)  //we got the response
             alert('Successfully called');
         ,
         error: function(jqxhr, status, exception) 
             alert('Exception:', exception);
         
     )
 )

【讨论】:

嗯,当我尝试这样做时,.js 文件甚至没有加载。注释掉成功和错误部分使其再次工作。不知道这是怎么回事。 从不建议在评论中抛出错误,因为它会将 UI 错误情况暴露给每个用户。更好的方法可能是使用带有红色字体的 console.log。 这会引发Object object 错误。不知道如何继续【参考方案3】:

这是我为了在 ajax 调用后调试并将 php 错误放入 javascript console.log 所做的:

    $('#ChangePermission').click(function () 
    $.ajax(
        url: 'change_permission.php',
        type: 'POST',
        data: 
            'user': document.GetElementById("user").value,
            'perm': document.GetElementById("perm").value
        ,
        success: function (data) 
            console.log(data);  
        ,
        error: function (data) 
            console.log(data);
        
    );
);

在 php 方面,我首先要求将所有错误返回到字符串 concat 并以 json 编码响应的形式回显,该响应也将包括 php 错误消息(如果有)。

<?php

error_reporting(E_ALL);
require_once(functions . php);
$result = "true";
$DBH = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);  
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$STH = $DBH->prepare("INSERT INTO people ( username, permissions ) values (?, ?)");

if (isset($_POST["user"]) && isset($_POST["perm"])) 
    $STH->bindParam(1, $_POST["user"], PDO::PARAM_STR);
    $STH->bindParam(2, $_POST["perm"], PDO::PARAM_STR);

try 
    $STH->execute();
 catch (PDOException $e) 
    $result .= $e->getMessage;

echo json_encode($result);
?>

【讨论】:

【参考方案4】:

Firebug 作为 Firefox (FF) 扩展目前(根据​​ 01/2017)是调试来自 AJAX 调用的直接 javascript 响应的唯一方法。不幸的是,它的开发已经停止。从 Firefox 50 开始,由于兼容性问题,Firebug 也无法再安装 :-( 他们模仿 FF 开发者工具 UI 以某种方式召回 Firebug UI。

不幸的是,FF 原生开发者工具无法调试 AJAX 调用直接返回的 javascript。同样适用于 Chrome 开发。工具。

由于这个问题,我必须禁用 FF 的升级,因为我非常需要从当前项目的 XHR 调用中调试 JS。所以这里不是好消息 - 让我们希望调试直接 JS 响应的功能很快会被整合到 FF/Chrome 开发者工具中。

【讨论】:

【参考方案5】:

几乎可以使用任何现代浏览器来学习“网络”选项卡。 请参阅此关于 How to debug AJAX calls 的 SO 帖子。

【讨论】:

【参考方案6】:

您可以使用浏览器中的“网络”标签 (shift+ctrl+i) 或Firebug。 但在我看来,更好的解决方案是使用外部程序(例如Fiddler)来监控/捕获浏览器和服务器之间的流量。

【讨论】:

这是唯一正确的答案。不要添加代码来调试,使用工具。 Chrome network tab 现在可能比 Firebug 更好。 Fiddler 允许您在发送之前修改 Ajax 请求。这是我正在寻找的功能。理想情况下,我想从 devtools 中做这样的事情。我需要在 Ajax 请求中添加/修改参数。 Firefox devtools 将其提供为“编辑并重新发送!”。到目前为止,Chrome 似乎没有运气。【参考方案7】:

如果您使用的是 mozilla firefox,请安装一个名为 firebug 的插件。

在您的页面中,在 Mozilla 中按 f12 并打开 firebug。

在firebug中找到net标签,在这个标签中进入xhr标签。 并重新加载您的页面。 你会在xhrParamsHeadersResponsehtmlCookies得到5个选项

因此,通过进入 responsehtml,您可以看到在您的 ajax 调用之后得到的响应。

如果您有任何问题,请告诉我。

【讨论】:

【参考方案8】:

只需在 jQuery 加载之后和代码之前添加它。

$(window).ajaxComplete(function () console.log('Ajax Complete'); );
$(window).ajaxError(function (data, textStatus, jqXHR) console.log('Ajax Error');
    console.log('data: ' + data);
    console.log('textStatus: ' + textStatus);
        console.log('jqXHR: ' + jqXHR); );
$(window).ajaxSend(function () console.log('Ajax Send'); );
$(window).ajaxStart(function () console.log('Ajax Start'); );
$(window).ajaxStop(function () console.log('Ajax Stop'); );
$(window).ajaxSuccess(function () console.log('Ajax Success'); );

【讨论】:

所以如果没有触发,这是否意味着根本没有调用 ajax 调用?我在 .click 函数中添加了一个 alert(),所以我知道它被触发了。不过,你的代码放在那里我没有得到任何东西.. 我想是的。这应该会在浏览器控制台中显示 jQuery ajax 调用的每一步。【参考方案9】:

安装 Firebig 以查看错误发生的位置。您还可以在 ajax 调用中设置回调以从 PHP 中返回错误消息。例如。

error: function(e)
     alert(e);
     

【讨论】:

我下载了萤火虫,但我不确定在哪里寻找错误。当我单击按钮时,所有选项卡似乎都已加载并且没有任何变化(尽管我可以在 .click 函数中弹出一个警报窗口)。此外,当我添加错误或成功函数时,.js 文件甚至不会加载。在这一点上我很困惑。【参考方案10】:

你可以使用成功功能,一旦看到这个jquery.ajax settings

 $('#ChangePermission').click(function()
    $.ajax(
        url: 'change_permission.php',
        type: 'POST',
        data: 
        'user': document.GetElementById("user").value,
        'perm': document.GetElementById("perm").value
        
       success:function(result)//we got the response
       
        //you can try to write alert(result) to see what is the response,this result variable will contains what you prints in the php page
       
    )
)

我们也可以有error()函数

希望对你有帮助

【讨论】:

我尝试使用success函数,它似乎没有触发,所以我猜这是AJAX调用的问题。有什么方法可以获取有关它为什么不起作用的信息?

以上是关于如何调试 jquery AJAX 调用?的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 调用在 keyup 函数中不起作用

如何调试通过 AJAX(特别是 jQuery)加载的 Javascript

ajax基础学习

Jquery的Ajax实现异步刷新

用JQuery Ajax 与一般处理程序 请求数据无刷新,以及如何调试错误

封装通用的 ajax, 基于 jQuery。