Как стать автором
Обновить

Несовершенный мир браузеров: кодирование URI в ссылках

Время на прочтение2 мин
Количество просмотров588
На днях столкнулся с очередным несовершенством мира браузеров. Может это тривиальная вещь, но поиск по хабру не дал результатов.

Имеется ссылка на странице, которая содержит не-ASCII символы. Если брать значение href яваскриптом, то результат отличается между браузерами.

Согласно рекомендациям W3C браузер должен заескейпить невалидные символы в ссылке. Но там не сказано в какой именно момент агентам нужно сделать перекодировку (я не нашел). Одно точно ясно — при отправке запроса URI уже закодирован.

Проверим поведение разных браузеров на следующей тестовой странице:
<html>
<head>
  <script type="text/javascript">
    window.onload = function() {
      alert(document.getElementById("anchor").href);
    }
  </script>
</head>
<body>
  <a id="anchor" href="http://www.google.ru/search?q=Hello world!">Test link</a>  
</body>
</html>


* This source code was highlighted with Source Code Highlighter.

Посмотрим, что нам скажут браузеры на простую ссылку с пробелом «http://www.google.ru/search?q=Hello world!»:
Браузер Результат
IE7, IE8
http://www.google.ru/search?q=Hello world!
Chrome 2.0, 4.0
http://www.google.ru/search?q=Hello%20world!
Opera 9.6
http://www.google.ru/search?q=Hello%20world!
Firefox 3.5.2
http://www.google.ru/search?q=Hello%20world!
Safari 4.31
http://www.google.ru/search?q=Hello%20world!

Ух! Кажется, IE опять пошел своим путём: в то время как все браузеры перекодировали ссылки и сохранили их в DOM, IE оставляет это действие на потом.

Сделаем второй тест. На этот раз используем ссылку вида «javascript:alert('Hello world!')».
Браузер Результат
IE7, IE8
javascript:alert('Hello world!')
Chrome 2.0, 4.0
javascript:alert('Hello world!')
Opera 9.6
javascript:alert('Hello world!')
Firefox 3.5.2
javascript:alert('Hello%20world!')
Safari 4.31
javascript:alert('Hello%20world!')

Неожиданный поворот событий, не так ли? У меня нет объяснений почему это происходит. Может кто-нибудь сможет прокомментировать?

Be aware. Можно использовать в таких случаях decodeURI() или decodeURIComponent() для приведения ссылки к общему знаменателю.

UPD: По наводке tenshi, проверил .getAttribute('href'). Во всех браузерах получаемое значение равно оригинальному, не перекодированному.
Теги:
Хабы:
Всего голосов 16: ↑12 и ↓4+8
Комментарии11

Публикации

Ближайшие события