这个 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] 的结果不是对象