Ответ 1
Как обсуждалось в комментариях, существует много разных способов построения строки, которая вызывает эту проблему, и в большинстве случаев нет необходимости иметь знаки в два процента.
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 по ссылке команды, чтобы проверить, не были ли зарегистрированы какие-либо ошибки.
В самом деле, та же ошибка, которую вы видите, если вы запустили decodeURI
на некорректном URL (т.е. decodeURI('http://example.com/%')
), печаталась на консоли:
[4810: 1287: 0107/164725: ОШИБКА: КОНСОЛЬ (683)] "Неиспользуемый URIError: URI malformed", источник: chrome-devtools://devtools/bundled/devtools.js(683)
Итак, я открыл URL 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)
Как мы видим, decodeURI(url)
вызывается на URL без проверки ошибок, тем самым бросая исключение и разбивая консоль разработчика.
Реальное исправление для этой проблемы будет связано с добавлением обработки ошибок в код консоли Chrome, но тем временем один из способов избежать этой проблемы - обернуть строку в сложный тип данных, например массив, чтобы предотвратить синтаксический анализ, когда каротаж.
var x = "http://example.com/%";
console.log([x]);
К счастью, проблема с поврежденной консолью не сохраняется после закрытия вкладки и не влияет на другие вкладки.
Update:
По-видимому, проблема может сохраняться через вкладки и перезапускаться, если отмечен журнал сохранения. Снимите этот флажок, если у вас возникла эта проблема.
Обновление 2:
В Chrome 40 эта проблема исправлена.