3

我在一个相对庞大的 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 块中,最初是捕获源问题,然后重新抛出它。仍然不知道为什么,但如果没有,那会更容易找到,因为它是为此目的而设计的,以防万一它坏了。诡异的。可能不喜欢深层次的重投。

我会留下这个问题,因为现在没有实际问题的答案。

4

2 回答 2

2

正如@galambalazs 建议的那样,您可以尝试 IE8 调试器;IE6 时代的旧调试器通常没用。

我一直使用的低级技术是在我的 Javascript 源代码的大部分周围添加我自己的 try/catch 块,以缩小错误源。通过反复调整 try/catch 块,您可以通过源代码进行“二分搜索”以定位导致异常的代码。您可能会发现,在 Firefox 中有一些代码是无害的,但 IE 的解释器认为这些代码是错误的。(平心而论, IE的严格性通常是有道理的,而Firefox的松懈行为确实是不可取的。)

因此,换句话说,您将从您怀疑的 Javascript 源开始,或者您可能会对所有包含的 .js 文件执行此操作:

// top of Javascript source file foo.js
try {
  // ... all the code ...
} catch (x) { alert("Error in foo.js: " + x); }

现在,如果您加载页面并收到该警报,那么您知道错误在 foo.js 中的某个地方。因此,您将其分成两半:

// top of foo.js
try {
  // ... half the code, roughly ...
}
catch (x) { alert("Error in first half of foo.js: " + x); }
try {
  // ... the rest of the code ...
} catch (x) { alert("Error in second half of foo.js: " + x); }

重复这个过程,你最终会发现问题。

于 2010-11-24T13:54:29.573 回答
0

您可以尝试Microsoft Script DebuggerInternet Explorer Developer Tools

有关 IE 8 中可能与旧版本不同的完整列表,请咨询:

另请参阅Web Bug Track了解可能的怪癖。

作为最后一点,console.log在每一行都做可能会帮助您以一种困难的方式找到特定的错误,但考虑到您应该为模块编写单元测试的代码量。这是确保应用程序在不同输入和条件下实际运行的唯一方法。

于 2010-11-24T13:50:42.507 回答