这个JavaScript打破了控制台吗?

use*_*041 46 javascript browser google-chrome

只是在谷歌浏览器中做一些JavaScript的东西(现在不想在其他浏览器中尝试,以防这真的造成真正的损害),我不知道为什么这似乎打破了我的控制台.

>var x = "http://www.foo.bar/q?name=%%this%%";
<undefined
>x
Run Code Online (Sandbox Code Playgroud)

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

console.clear();
Run Code Online (Sandbox Code Playgroud)

它给了我

Console was cleared
Run Code Online (Sandbox Code Playgroud)

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

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

此处提交了此问题的错误报告.

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

Ale*_*ara 51

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

http://example.com/%
http://%%%
http://ab%
http://%ab
http://%zz
Run Code Online (Sandbox Code Playgroud)

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

http://ab%20cd
Run Code Online (Sandbox Code Playgroud)

此外,字符串http://%,并且http://%%也将正确打印,因为Chrome浏览器不会自动链接一个网址链接字符串,除非http://后面至少3个字符.

从这里我假设问题必须是在控制台中链接URL字符串的过程中,可能是在解码格式错误的URL的过程中.我记得decodeURI如果给出格式错误的URL,JavaScript函数将抛出异常,并且由于Chrome的开发人员工具主要是用JavaScript编写的,这可能是显然崩溃了开发人员控制台的问题吗?

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

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

[4810:1287:0107/164725:错误:控制台(683)]"未捕获URIError:URI格式错误",来源:chrome-devtools://devtools/bundled/devtools.js(683)

所以,我chrome-devtools://devtools/bundled/devtools.js在Chrome中打开了网址,在第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)
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,decodeURI(url)在没有任何错误检查的情况下调用URL,从而抛出异常并使开发人员控制台崩溃.

对此问题的真正修复将来自向Chrome控制台代码添加错误处理,但与此同时,避免此问题的一种方法是将字符串包装在复杂数据类型(如数组)中以防止在记录时进行解析.

var x = "http://example.com/%";
console.log([x]);
Run Code Online (Sandbox Code Playgroud)

值得庆幸的是,一旦选项卡关闭,破坏的控制台问题就不会持续存在,并且不会影响其他选项卡.

更新:

显然,如果选中"保留日志",则问题可能会持续显示并重新启动.如果您遇到此问题,请取消选中此项.

更新2:

从Chrome 40开始,此问题已修复.

  • 找到这个问题根源的伟大侦探工作!:-D (7认同)
  • 哇我不是很聪明......我保留了日志检查...对不起大家 (4认同)
  • @ user2879041很高兴知道!我在答案中添加了一个不用于帮助未来读者的内容. (2认同)