Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I debug Javascript which was loaded via AJAX (specifically jQuery)

I have changed my coding style with more complex projects to loading pages (And their embedded scripts) "on demand" recently. However, it is difficult to debug those scripts as when they are loaded like:

jQuery.get('/myModularPage', function(html){ /* insert the loaded page into the DOM */ }); 

or

$('#some-container').load('/myOtherPage'); 

These scripts run perfectly, but if I'm debugging, how can I set breakpoints in these dynamically loaded pages and scripts?

like image 805
BLSully Avatar asked Oct 29 '12 21:10

BLSully


People also ask

How do I debug Ajax in Visual Studio?

In Visual Studio, if you start your application for debugging (by pressing F5 or using the Start Debugging command in the Debug menu), the debugger is attached automatically. You can also attach the Visual Studio debugger to Internet Explorer when the application is already running.


2 Answers

Add this to your js files where you want it to break:

debugger; 

Then step into/over/out like any other debugger.

Works for dynamically loaded scripts and pages. Only works in Chrome as far as I know.

like image 54
Squeee123 Avatar answered Sep 25 '22 19:09

Squeee123


UPDATE

The accepted form is now with a # (hashtag) rather than @ (at symbol)

The syntax was changed to to avoid conflicts with IE conditional compilation statements and some other issues (thanks to Oleksandr Pshenychnyy and Varunkumar Nagarajan for pointing this out)

//#sourceURL=/path/to/file  

This can really be any string that helps you identify the block of code.

An additional good point from JMac:

For me, the js file was being displayed in the sources list within a group called "(no domain)". Might be worth mentioning as I missed it at first!

ORIGINAL

I struggled with the above for about a week before running across this article. It really does work perfectly for my development environment (Chrome 22 as I write this).

Firebug also supports developer-named eval() buffers: just add a line to the end of your eval(expression) like:

//@ sourceURL=foo.js 

For example, given this simple html document:

<!DOCTYPE html> <html> <body>     <p>My page's content</p>     <div id="counter"></div>     <script type="text/javascript">         //if this page is loaded into the DOM via ajax          //the following code can't be debugged          //(or even browsed in dev-tools)          for(i=0;i<10;i+=1) {             document.getElementById('counter').innerText = i;         }          //but if I add the line below         //it will "magically" show up in Dev Tools (or Firebug)          //@ sourceURL=/path/to/my/ajaxed/page     </script> <body> </html> 

Things I haven't yet discovered:

  • Does this have to be done for every script block for inline scripts?
  • Does it have to be the last line of the script block? (The article would suggest the answer to this is yes)
like image 41
BLSully Avatar answered Sep 24 '22 19:09

BLSully