【发布时间】:2011-05-15 02:56:39
【问题描述】:
我在一个相对庞大的 ECMAScript 代码库 (> 60,000 LOC) 上工作,我们往往会为我们可怕的朋友 Internet Explorer(尤其是 6 和 7)检测错误而费力。
目前,我被一个问题困扰了 3 天,我的 RIA 在 Google Chrome、Firefox 3.6、Opera 和 Internet Explorer 8 中呈现良好,但在 IE7 模式下运行 Internet Explorer 8(或一个真正的 IE-7)。
我的问题是:如何识别会在 IE7 中产生错误的代码?
通常我依赖 JSLint 并且我倾向于捕捉通常的嫌疑人(尾随逗号,我讨厌你),但在这种特殊情况下,我刚刚对我的所有代码重新运行了一个 linter,包括源代码和最小化代码,它不会产生我通常的嫌疑人。所以我想我错误地引入了 IE 不喜欢的东西(谁知道呢,也许我疯了,在某处使用了 Array.map 而不是 dojo.map?)它在我的脸上炸开了,产生了很好的错误消息对我一点帮助都没有(“[object object]”和“is null”在不应该出现的地方,所以我认为上游存在错误,该错误以静默方式失败并阻止创建此对象)。
我曾尝试查看 Google Closure Linter,但它并没有产生任何特别之处,而且我认为 Google Closure Compiler 也不会成为我的救星。是否有任何工具(命令行、Web 服务或其他)可以像模拟 IE 一样解析/运行代码,以便我们得到相应的错误?
感谢任何提示。
编辑:感谢您迄今为止在尝试解决我的问题方面提供的帮助,但我真正要问的是是否有工具可以进行此类检查,这意味着针对特定浏览器验证功能集和语法。在我看来,这是 JS 世界中严重缺乏的东西(对于 FF 或 Chrome 而言,显然它们的调试器更有帮助)。
EDIT2:我今天(3 天后)最终找到了问题的根源,方法是检查两个分支之间的所有代码更改,并意识到问题实际上已经存在,但之前从未检测到,并通过更旧的更改返回到缩小混乱范围并最终在所有地方添加控制台日志,直到我遇到故障点(上帝感谢 emacs 的正则表达式支持,可以将日志添加到每一行......很重但有效......)。不过有趣的事实是:IE 吞下了一条错误消息,该消息应该显示在 try catch 块中,最初是捕获源问题,然后重新抛出它。仍然不知道为什么,但如果没有,那会更容易找到,因为它是为此目的而设计的,以防万一它坏了。诡异的。可能不喜欢重投的深层次。
我将保留这个问题,因为目前没有实际问题的答案。
【问题讨论】:
-
当您在 IE8 中以良好的旧 IE7 模式运行并打开调试控制台时,您是否选中了“错误中断”按钮,以便指出错误发生的位置?
-
JSLint 和 Closure 编译器更多是关于语法问题,而不是 Browser X 不支持 Y 方法。
-
@epascarello:是的,除了它指向我们的一个 throw 语句,然后通过堆栈跟踪显示我们抛出的内容并不能确定任何内容。另外,它似乎并不特定于该文件:如果我更改在引导程序中启动的文件的顺序,它将在某个地方失败,无论哪个是第一个。我知道 JSLint 和 Closure 不这样做,但通常与浏览器相关的主要问题是 IE7 的尾随逗号,它们确实有助于捕捉到这一点。当然,不会对其他任何事情有太大帮助。
-
@epascarello:实际上,如前所述,它指出了一个对象(实际上是对象的包命名空间)为空的行(因为在这种情况下,但不应该是。但是之前没有抛出其他错误......除了控制台在这个特定错误之前仍然只显示一个红色的“[object object]”消息,但没有中断它)。
标签: javascript debugging internet-explorer jslint google-closure-compiler