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

我已经改变了我的编码风格,更复杂的项目,以最近“按需”加载页面(和他们的embedded式脚本)。 但是,像这样加载时,很难debugging这些脚本:

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

要么

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

这些脚本运行完美,但如果我正在debugging,我怎样才能在这些dynamic加载的页面和脚本中设置断点?

把它添加到你想要破解的js文件中:

 debugger; 

然后像任何其他debugging器一样进/出/出。

适用于dynamic加载的脚本和页面。 据我所知,只能在Chrome中运行。

UPDATE

现在接受的forms是# (hashtag)而不是@ (在符号)

语法改为避免与IE条件编译语句和其他一些问题的冲突(感谢Oleksandr Pshenychnyy和Varunkumar Nagarajan指出这一点)

 //#sourceURL=/path/to/file 

这实际上可以是任何可以帮助您识别代码块的string。

JMac的另一个好处是:

对我来说,js文件被显示在一个名为“(无域)”的组中的源列表中。 可能值得一提,因为我一开始就错过了!

原版的

在跑过这篇文章之前,我一直在争取上述的一个星期。 它确实适合我的开发环境(我写这篇文章的时候是Chrome 22)。

Firebug也支持开发人员命名的eval()缓冲区:只需添加一行到你的eval(expression式)的末尾,如:

 //@ sourceURL=foo.js 

例如,给这个简单的html文件:

 <!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> 

我还没有发现的东西:

  • 内嵌脚本的每个脚本块都必须完成吗?
  • 它是否必须是脚本块的最后一行? (文章会build议这个答案是肯定的

这个问题看起来像现在一般使用新的附注来解决:

 //# sourceURL=filename 

注意'hash' #而不是'at' @符号。

通过在源代码中包含该行,对其的引用将显示在debugging器中!

正如你已经提到的,你可以使用//@ sourceURL 。 Chrome似乎并不支持内联脚本的//@ sourceURL 。 它在evalexpression式上工作。 源地图上的这篇HTML5文章给出了关于命名eval块的更多细节,以及代码中任何匿名函数的命名。

而不是使用eval,你可以尝试embedded一个脚本标签或JSONP可能。