На днях столкнулся с очередным несовершенством мира браузеров. Может это тривиальная вещь, но поиск по хабру не дал результатов.
Имеется ссылка на странице, которая содержит не-ASCII символы. Если брать значение href яваскриптом, то результат отличается между браузерами.
Согласно рекомендациям W3C браузер должен заескейпить невалидные символы в ссылке. Но там не сказано в какой именно момент агентам нужно сделать перекодировку (я не нашел). Одно точно ясно — при отправке запроса URI уже закодирован.
Проверим поведение разных браузеров на следующей тестовой странице:
Посмотрим, что нам скажут браузеры на простую ссылку с пробелом «http://www.google.ru/search?q=Hello world!»:
Ух! Кажется, IE опять пошел своим путём: в то время как все браузеры перекодировали ссылки и сохранили их в DOM, IE оставляет это действие на потом.
Сделаем второй тест. На этот раз используем ссылку вида «javascript:alert('Hello world!')».
Неожиданный поворот событий, не так ли? У меня нет объяснений почему это происходит. Может кто-нибудь сможет прокомментировать?
Be aware. Можно использовать в таких случаях decodeURI() или decodeURIComponent() для приведения ссылки к общему знаменателю.
UPD: По наводке tenshi, проверил .getAttribute('href'). Во всех браузерах получаемое значение равно оригинальному, не перекодированному.
Имеется ссылка на странице, которая содержит не-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'). Во всех браузерах получаемое значение равно оригинальному, не перекодированному.