Debugging Ajax code with Firebug

I've a couple of problems debugging code returned in an Ajax call - specifically, a function returned in json (errors don't get trapped in Firefox) - up to the point where I started debugging these problems in Internet Explorer (I think it's a firefox related problem, as Venkman doesn't detects those errors either) Do you know of any way to debug code returned in json from an Ajax call?


EDITED 03/04/2009 15:05


Thanks to all for your responses, but I think I didn't explain myself well enough. I know enough of Firebug to do basic debugging, but my problem happens when I fetch some code in an Ajax call that has a problem with it. Let's say we have the following HTML file (you'll need prototype in the same folder to make it work correctly):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<script>
function ajaxErrorTest()
{
    new Ajax.Request('data.json', {
           'method': 'get',
           'onSuccess': function(data){
           if(data.responseJSON.func)
           data.responseJSON.func();}});
}
</script>
<input type="button" value="test" onclick="ajaxErrorTest();" />
</body>
</html>

and then, the contents of the data.json file is this:

{'func':function(){console.log('loaded...');alert('hey');}}

If you load the page in a browser and click the 'Test' button (and everything goes well) you'll get something in the console, and an alert box that says 'hey'. Now change the data.json file to this:

{'func':function(){console.log('loaded...');alerts('hey');}}

...and click the 'Test' button again (no need to reload the page ;-) You get the console line, but no alert box... and no errors!!! this is the kind of errors I'm trying to debug.


Try clicking on the "Console" panel (it's a tab) and enabling it. You will find that any HTTP requests will be caught along with any information that they contain. I use this in order to view any JSON stored in the request as well as any errors (500/404/etc).

Also be aware that you have to enable the console panel on a per-domain basis. There are usually three subtabs: headers, post, and response. I usually use the post/response tabs quite a bit when I'm debugging my AJAX.


You probably want to use the Net tab and filter the requests for XMLHttpRequests (XHR) only.

Additional tips:

  • don't hesitate to console.dir(yourObject) in your code or directly in the console panel. This will give you the complete state and properties of your object.
  • check your request/response HTTP headers; sometimes it's just a matter of encoding.
  • if you don't know what event/user action triggered this XHR call, you can add console.trace() right before your AJAX call. This way you'll get the complete call stack.
  • Edit:

    Code executed in another context

    The only way I came up with is surrounding your code with an (ugly) try/catch. I guess it's because the code is executed in another javascript context

    <script>
    function ajaxErrorTest()
    {
        new Ajax.Request('data.json', {
               'method': 'get',
               'onSuccess': function(data){
    
               try{
                 if(data.responseJSON.func)
                 data.responseJSON.func();}});
               } catch (err) {
                 console.dir(err);
               }
    }
    </script>
    

    This code gives a detailed error message:

    ReferenceError: alerts is not defined
    

    I really doubt changing the execution context will solve the problem. I don't know how to this with prototype, but with jquery, it can be done easily:

    $.ajax({
      url: "test.html",
      context: document.body,
      success: function(){
        $(this).addClass("done");
      }
    });
    

    I'm not sure this issue involves the actual JSON that is retrieved. Can you try throwing an error directly in your onSuccess handler and see if it appears in the Firebug console? Something like this:

    onSuccess: function() { alerts('hey'); }
    

    If this is the case, then this issue should be fixed in Firebug 1.7.

    链接地址: http://www.djcxy.com/p/51876.html

    上一篇: Firebug在显示FirePHP错误时冻结了Firefox

    下一篇: 用Firebug调试Ajax代码