【问题标题】:Can I "step over" just jQuery code while debugging?我可以在调试时“跳过”jQuery 代码吗?
【发布时间】:2011-02-22 12:35:17
【问题描述】:

在单步执行使用 jQuery 的脚本时,我只是想测试 我编写的代码。我不想进入 jQuery 文件——我不是在调试 jQuery,只是在调试我自己的文件。

有什么方法可以告诉调试器不要进入 jQuery 文件?我使用 Visual Studio + Internet Explorer 和 Firefox + Firebug 来单步执行代码……而且似乎都喜欢单步执行数十个 jQuery 语句。

例如,假设我有一个这样的脚本:

$("div").each(function() {
   $(this).hide();
});

这在技术上是一个单一的语句——因此“Step Over”将一次执行所有代码,这将跳过内部的“hide”语句。但是,“Step Into”会带我进入 jQuery 代码,在它带我进入“hide”语句之前,我将不得不步进数十行代码。

我想让调试器完全忽略 jQuery 代码,这样我就可以轻松地单步执行我自己的代码,而无需单步执行 jQuery 代码。

在 C# 中,这可以通过在类上使用 [DebuggerStepThrough()] 属性来实现。但这对 JavaScript 没有帮助。

【问题讨论】:

  • 当然,这不是您问题的答案,但是在这种特定情况下,您可以在内部语句上放置一个断点并从外部语句继续。
  • 是的,这是真的。但是对于正常的调试,我需要在每一行设置一个断点来获得我想要的行为。
  • 这也是我一直在寻找的功能。我认为这将是对 Firebug 的一个很好的补充。

标签: javascript jquery visual-studio firefox firebug


【解决方案1】:

是的,你可以

至少在 FireFox (25+) 和 Chrome (30+) 中。

在 FireFox 中,此功能称为 "Black boxing",将在 FireFox 25 中提供。让我们完全按照您的要求进行操作:

Nick Fitzgerald and Chris Heilmann: "New Features of Firefox Developer Tools: Episode 25"

Chrome (v30+) 也引入了此功能,但查找/配置更难。它被称为“跳过具有特定名称的源”,Collin Miller 在描述如何配置它方面做得非常出色:

Collin Miller: "Tips and Tricks: Ignoring library code while debugging in Chrome"

我现在在 Chrome 中使用它。它就像一种魅力,为我节省了很多时间。

【讨论】:

  • 很棒的发现!感谢您重新审视这个问题,并改善每个人的调试体验。我想接受这个作为答案,但在 FF 25 和 Chrome 30 发布之前我不能。谢谢!
  • 已验证! Chrome 30 发布。感谢您发现这个新功能!
  • @ScottRippey 不客气!很高兴我能帮助你。谢谢你回来接受我的回答:)
  • 只是快速跟进...@flu 再次感谢您!这非常有效,并且为我节省了很多时间。很高兴他们添加了这个功能。
  • 您的两个链接都指向同一个页面。如果有机会,您能否更新/修复 Firefox 链接?我确信我可以在 googlies 上找到它,但它在这个答案中以及对于其他找到这个页面来寻找这个答案的人来说会更有帮助。非常感谢,当然也感谢您的回答!我也在寻找这个解决方案。
【解决方案2】:

很确定答案是“不,此功能不存在”。

但是,您在这里的动机是什么?在我看来,这就像在第 2 行设置断点并为第 1 行的“结果集”创建一个监视,而你在那里会得到你可能想要的东西。

【讨论】:

  • 是的,在这个例子中设置断点很容易。但我通常有数百行的大型脚本文件,通常是嵌套的 jQuery 样式,我不想在每一行都设置断点。我的动机是我希望能够单步调试和调试我的代码,而无需进出其他源文件。
【解决方案3】:

F10 应该跳过函数调用,F11 应该跳过函数调用。这适用于 VS 和 firebug。

【讨论】:

  • 我怀疑 OP 是在询问是否要从外部“每个”语句中一步步开始,然后将下一个语句视为闭包内的语句。这似乎是踩踏时的自然愿望。
  • 吉诃德是对的。上面的例子在技术上只是一条语句,所以如果我按 F10,整个块将被执行。但是,如果我按 F11,在我输入“function() { $(this).hide() }”之前将执行数百个 jQuery 语句,所以我会坐在那里按 F11,直到我看到执行回到我的脚本。应该有办法完全忽略 jQuery 代码。
【解决方案4】:

至少 Firebug 的 JavaScript 调试器有一个“跳过”选项,它仍然不会进入函数调用。

但是,您必须根据调用的函数类型手动在“step (into)”和“step over”之间进行选择。

【讨论】:

    【解决方案5】:

    答案很简单,你只需要重构函数。想不起来了

    $("div").each(function() {
       doThis(this);
    });
    
    function doThis(object) {
       $(this).hide();
    }
    

    几乎可以肯定,它可以与一个中规中矩的调试器一起工作。

    【讨论】:

    • 哎呀,脑残,把参数里的object换成div或者item什么的,然后把$(this).hide()中的this替换掉;不管你怎么称呼它。
    • 这与我已经给出的示例完全相同。如果调试器在第 1 行,并且您“单步执行”,您将在“doThis”之前单步执行十几个 jQuery 行。如果你“Step Over”,你也会越过“doThis”函数。
    • 你应该可以在 hide 语句上设置一个断点。此外,如果您正在调试 JS,请使用 Firefox 和 Firebug。
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2011-06-24
    • 1970-01-01
    • 2022-12-11
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多