这个 JavaScript 是不是破坏了控制台?

Posted

技术标签:

【中文标题】这个 JavaScript 是不是破坏了控制台?【英文标题】:Did this JavaScript break the console?这个 JavaScript 是否破坏了控制台? 【发布时间】:2015-03-05 21:35:08 【问题描述】:

只是在 google chrome 中做一些 javascript 的东西(暂时不想在其他浏览器中尝试,以防这真的造成了真正的损害),我不确定为什么这似乎破坏了我的控制台。

>var x = "http://www.foo.bar/q?name=%%this%%";
<undefined
>x

在 x(并进入)之后,控制台停止工作......我重新启动了 chrome,现在当我做一个简单的时候

console.clear();

它给了我

Console was cleared

并且不清除控制台。现在在我的脚本中,console.log 没有注册,我想知道发生了什么。 99% 肯定这与双百分号 (%%) 有关。

任何人都知道我做错了什么或更好,如何修复控制台?

A bug report for this issue has been filed here.

编辑:感觉很愚蠢,但我检查了 Preserve 日志...这就是控制台没有清除的原因。

【问题讨论】:

无法复制。铬 39。 转载于此:jsfiddle.net/g2anoLxn。 Chrome 版本 39.0.2171.95 m(64 位) 我想我正在做点什么!请参阅:developer.chrome.com/devtools/docs/… 您可以在控制台中使用“printf”之类的格式。试试console.log("%s has %d points", "Sam", 100); 我认为这可能是因为它试图混合 % 格式,同时尝试将 url 格式化为控制台中的可点击链接 @AlexanderO'Mara:你成功了! Chrome 需要 3+ 个字符才能将其作为链接显示在控制台中。 'http://a''http://ab'显示为可点击链接(即使它们可能是有效的)。 'http://abc' 一个可点击的链接。所以,'http://a%' 有效,但 'http://ab%' 中断!这也意味着'http://%a' 有效,而'http://%ab' 中断。 【参考方案1】:

正如在 cmets 中所讨论的,实际上有许多不同的方式来构造导致此问题的字符串,并且在大多数情况下没有必要有两个百分号。

http://example.com/%
http://%%%
http://ab%
http://%ab
http://%zz

然而,破坏 Chrome 控制台的不只是百分号的存在,当我们输入以下格式正确的 URL 时,控制台会继续正常工作并生成可点击的链接。

http://ab%20cd

此外,字符串 http://%http://%% 也将正确打印,因为 Chrome 不会自动链接 URL 链接字符串,除非 http:// 后跟至少 3 个字符。

从这里我假设问题一定是在控制台中链接 URL 字符串的过程中,可能是在解码格式错误的 URL 的过程中。我记得 JavaScript 函数 decodeURI 会在给出格式错误的 URL 时抛出异常,并且由于 Chrome 的开发者工具主要是用 JavaScript 编写的,这可能是导致开发者控制台明显崩溃的问题吗?

为了测试这个理论,我通过命令链接运行 Chrome,查看是否记录了任何错误。

确实,如果您在格式错误的 URL(即decodeURI('http://example.com/%'))上运行 decodeURI,您会看到同样的错误被打印到控制台:

[4810:1287:0107/164725:ERROR:CONSOLE(683)]“未捕获的 URIError:URI 格式错误”,来源:chrome-devtools://devtools/bundled/devtools.js (683)

于是,我在 Chrome 中打开了 URL chrome-devtools://devtools/bundled/devtools.js,在第 683 行,我发现了以下内容。

var parsedURL=new WebInspector.ParsedURL(decodeURI(url));var origin;var folderPath;var name;if(parsedURL.isValid)origin=parsedURL.scheme+"://"+parsedURL.host;if(parsedURL.port)

正如我们所见,decodeURI(url) 在 URL 上被调用,没有任何错误检查,因此抛出异常并导致开发者控制台崩溃。

真正解决这个问题的方法是向 Chrome 控制台代码添加错误处理,但与此同时,避免该问题的一种方法是将字符串包装在一个复杂的数据类型中,如数组,以防止在记录。

var x = "http://example.com/%";
console.log([x]);

谢天谢地,关闭选项卡后控制台损坏问题不会持续存在,并且不会影响其他选项卡。

更新:

显然,如果选中“保留日志”,该问题可能会在选项卡中持续存在并重新启动。如果您遇到此问题,请取消选中此项。

更新 2:

从 Chrome 40 开始,此问题已得到修复。

【讨论】:

我的控制台问题在选项卡/新窗口中持续存在。它实际上非常讨厌。另外,我不确定这是否一定是正确的答案,但我现在会标记它,因为您确实生成了一种将该字符串记录到控制台的方法。有人知道我如何重置控制台吗?仍然收到“控制台已清除”且未清除任何内容! @user2879041 嗯,这很奇怪,它不适合我。它是否会在重新启动后持续存在? @user2879041:Chrome 可能没有完全关闭?有些 Chrome Web Apps 不能在后台运行吗? 哇,我不是很聪明...我检查了保留日志...对不起大家 @user2879041 很高兴知道!为了帮助未来的读者,我在答案中添加了一个 not of this。

以上是关于这个 JavaScript 是不是破坏了控制台?的主要内容,如果未能解决你的问题,请参考以下文章

用JavaScript的console控制台输出一个靠右的直角三角形怎么写代码?

Google Maps 脚本破坏了 Safari TypeError:表达式“document.body”[null] 的结果不是对象

我可以依靠 ETags 进行缓存控制吗

可以设置域 cookie 破坏跨域安全性的 javascript 小书签吗?

JavaScript中一个对象中的默认破坏函数参数

怎么写jQuery插件