如何高效地逐步进行jQuery代码?

26

我刚刚开始使用jQuery,之前一直在使用YUI。虽然我真的很欣赏jQuery库提供的许多功能,但我发现在调试器中逐步执行jQuery代码非常麻烦,想知道除了显而易见的方法外是否有其他技巧。

以这样一个简单的函数为例:

function findFirstShortChild(parent) {
    var result = null;
    $("#" + parent + " li").each(function() {
        if ($(this).css("height") <= 10) {
            result = this;
            return(false);    // break out of each() function
        }
    });
    return(result);
}
如果函数没有按预期工作,我决定想要逐步执行它,但这一点并不直观。实际上,你根本不能真正地逐步执行它。你必须穿过许多 jQuery 代码才能找到需要的地方。你无法进入 .each() 循环,因为它实际上不是传统的循环。与其他库相比,在调试器中我感到非常低效。以下是我的问题:
- 如果你逐行执行代码,你会陷入大量的 jQuery 函数中。 - 如果你想进入 each 循环的内部,你需要穿过很多 jQuery 代码或设置断点并让它命中断点才可以。 - 你无法看到任何中间值(例如 $(this))或为什么可能会得到错误的高度值,而又不需要逐步执行成千上万行外部的 jQuery 代码。 - 你无法像在传统循环中那样跳出 each 循环(使用 break 或 return),因为它不是一个实际的循环。循环在 .each() 函数内部。在这里看起来像一个循环的东西只不过是一个函数调用的内部。 - 如果我想知道为什么在循环中得到了错误的高度值,有没有办法在不逐步执行大量 jQuery 代码的情况下弄清楚呢?
那么,我在这里错了什么?是不是逐步执行这种代码更不方便?我是否错过了内置于 jQuery 框架中的一些神奇技巧来帮助解决这个问题?还是使用这种样式库要付出的代价就是要完全改变您如何调试问题。
你需要做的:
- 在有问题的地方为中间值分配本地变量,以便更轻松地检查它们,而无需逐步执行大量 jQuery 函数。 - 而不是逐行执行,从断点到断点移动。 - 学习如何有效地进入和通过 jQuery 调用(efficiently)回答某些问题。
你们是怎么做的?我错过了什么?
我应该提到,在 Firefox 5 中,我使用 Firebug,在 Chrome 中使用内置的调试器(现在更频繁地使用 Chrome)。是的,我在调试时使用未经缩小的版本 jQuery。所以,这不是关于使用哪个调试器的问题,而是关于如何使用调试器有效地逐步执行 jQuery 代码的问题。

在使用Firebug调试each循环时,将断点放置在each函数内部。这样你就能够更容易地进行调试了。 - user405398
这个任务非常简单:“一直执行,直到离开jquery.js文件”。但似乎仍然没有自动化的方法! - joeytwiddle
我说得太早了。我们现在有了“黑盒测试”。https://dev59.com/nHE85IYBdhLWcg3wNwx3 - joeytwiddle
4个回答

14

工具

我正在使用Firebug调试带有一些jQuery调试扩展的代码:

FireQuery是与Firebug集成的Firefox扩展程序

  • 智能显示Firebug控制台和DOM检查器中的jQuery表达式
  • 附加的jQuery数据是一等公民
  • jQuery集合中的元素在悬停时会高亮显示
  • jQuerify:使您能够将jQuery注入任何网页
  • jQuery Lint:使您能够在页面加载时自动注入jQuery Lint(非常适用于临时代码验证)

Firefinder是Firebug的一个附加组件,可帮助查找与所选CSS选择器或XPath表达式匹配的HTML元素。您还可以通过悬停或上下文菜单自动选择元素。

示例

  • 您不能逐行步进,否则您将进入大量的jQuery函数。
  • 如果不经过大量的jQuery操作或设置断点并让其命中断点,您将无法进入each循环的内部。
当我想进入一个each循环并逐步调试时,我会在传递给each函数的函数中创建一个断点,然后逐行调试直到达到jQuery代码。现在我正在创建一个新的断点,在jQuery代码结束的位置继续调试。
  • 你看不到任何中间值(如$(this))是什么,也不知道为什么它可能会得到一个虚假的高度值,除非你逐步跟踪大量的外部jQuery代码。
看看http://msdn.microsoft.com/en-us/scriptjunkie/ee819093。例如在“场景2”中解释了如何查看this。本文提供了许多关于如何调试使用jQuery的代码的技巧。
  • 你不能像在传统循环中那样打破或返回来跳出每个循环,因为它不是一个真正的循环。循环在.each()函数内部。这里看起来像是一个循环,实际上只是函数调用的内部。
我不明白这个问题。你可以通过返回false来跳出each循环。当函数一次返回false时,传递给each函数的函数将不再被调用。
  • 如果我想知道为什么在循环中得到了一个虚假的高度值,有没有办法在不经过大量jQuery代码的情况下找出原因?

也许您在查看上面解释的this后会获得更多信息。但有时需要查看jQuery代码,但我并不经常这样做。当然,jQuery中也可能存在错误。 :-D

结论

是的,调试jQuery有点不同。但我认为,在短暂的熟悉阶段之后,您将已经修改了调试jQuery的风格。从断点到断点移动与使用jQuery节省的时间相比微不足道。

.


截至2014年,根据实际开发者的说法,FireQuery不再得到开发。 - L0j1k

3

虽然可能有些老套,但我很依赖console.log('你所选择的变量');,而且多数情况下这种方式都能够很好地满足我的需求。


11
我认为那是中学水平,而老派做法则是大量使用 alert() - davin
+1。然而,这有点繁琐和费力。唉。如果..只有某个浏览器的F12功能可以让我点击一个DOM元素并右键单击以列出所有相关的事件过程源代码和此源代码所在的文件。那么它可能会给我带来更美好的一天。 - Scott Chu

0

我一直喜欢使用Firebug来处理JQuery。但是,如果要进行更深入的调试,你确实需要了解JQuery。不过,JQuery也有开发者版本。


0

我同意使用Firebug - 在我能用的情况下,我会在Firefox中进行JS调试,因为Firebug非常好用。

特别是,我倾向于使用观察工具,以确定我所做的请求是否返回了正确的结果。您还可以使用此功能来识别$(this)或其他需要识别的内容,尽管“this”默认显示。

我经常将我的JQ代码拆分成比我本来要多得多的行,以帮助我确定自己的位置。当我知道调用正在工作时,我通常会缩小JQ。

使用这些方法,调试JQ是可以的。但是,我同意,如果不对JQ库进行步进操作,那么它会更容易。然而,我的后端代码的某些部分也适用于此。这就是生活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接