Проблемы с международными доменными именами + JQuery attr('href') в Firefox

Я пытаюсь установить href элемента с помощью jQuery. Когда я устанавливаю IDN в Firefox 6, href закодирован в URL-адресе. Одним из примеров является IDN http://r%C3%A4ksm%C3%B6rg%C3%A5s.se, преобразованный в http://r%C3%A4ksm%C3%B6rg%C3%A5s.se. Когда я делаю то же самое в других браузерах (IE8, Chrome 13, Safari 5.1), IDN не кодируется.

Причина, по которой я пытаюсь это сделать, заключается в том, что я позволяю пользователю изменять hrefs, а затем загружать подмножество содержимого страницы с помощью ajax на веб-сервер. Затем у меня возникают проблемы, так как ссылка скрыта глубоко в строке html; и я бы предпочел не выкапывать все элементы в строке html.

Есть ли способ отключить кодировку hrefs при настройке в Firefox? Или у вас есть другие способы решить проблему?

(Я заметил, что если href является действительным IDN punycode, т.е. http://www.xn--rksmrgs-5wao1o.se, браузеры хороши и денди. Но тогда мне нужно сделать кодировку punycode в js, чего я предпочитаю не делать; может быть одна или несколько ошибок, и нет похоже, это официальный выпуск кодировщика/декодера.)

На следующей html-странице отображается моя проблема. Если вы введете международное доменное имя (скопируйте и вставьте «http://www.räksmörgås.se»), #linkHtml получит весь элемент a, включая искаженный href при использовании Firefox и правильный href при использовании любого другого браузера. .

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script>
$(document).ready(function(){
$("#linkText").focus();
$("#linkText").keyup(function() {
    var href = $(this).val();
    $("#link").attr('href', href);
    $("#linkHtml").text($("#link").parent().html());
});
});
</script>
</head>
<body>
<div><input id="linkText" type=text /></div>
<div><a id="link" href="#">link</a></div>
<span id="linkHtml"></span>
</body>
</html>

person Thomas Lundström    schedule 01.09.2011    source источник
comment
Я видел это с TLD, которые не занесены в белый список Mozilla (хотя .se должен быть в порядке: mozilla.org/projects/security/tld-idn-policy-list.html), так что, возможно, здесь есть что-то похожее на ошибку? См. также: idn.icann.org/Firefox_Information и slideshare.net/playingwithsid/universal-acceptability   -  person m90    schedule 01.09.2011
comment
Хм, мне кажется, все в порядке (Firefox 6 @ ubuntu) - обновленный адрес href не закодирован.   -  person WTK    schedule 01.09.2011
comment
@WTK, вы проверяете вывод в диапазоне или в Firebug? Кажется, что Firebug декодирует URL-адрес, поэтому невозможно проверить только firebug.   -  person Thomas Lundström    schedule 01.09.2011
comment
Кстати, это та же проблема, что и stackoverflow.com/questions/6069187/? (Однако ответ на этот вопрос невозможен для этой проблемы; я не могу предвидеть, какие странные IDN будут вводить мои пользователи.)   -  person Thomas Lundström    schedule 01.09.2011
comment
Эти IDN всегда были абсолютным кошмаром *вздох*   -  person Lightness Races in Orbit    schedule 01.09.2011


Ответы (1)


Используйте decodeURI (собственная функция), если вас беспокоит, как отображается это значение href. Следующее отображается нормально в Firefox.

$("#linkHtml").text(decodeURI($("#link").parent().html()));

Технически, насколько я знаю, даже если Firefox показывает закодированное значение, вы должны быть в порядке с этими данными после отправки на какой-либо сервер.

person WTK    schedule 01.09.2011
comment
Это правда, что decodeURI в моем примере показывает правильно. Однако я отправляю подмножество DOM на сервер (т.е. отправляю $(#someDistantParentToTheLink).html()), и я немного боюсь, что это приведет к декодированию того, что не следует декодировать. - person Thomas Lundström; 01.09.2011
comment
Итак, вот и все, вам не следует его декодировать — все, что я знаю на стороне сервера, может справиться с таким декодированием. Вы упомянули, и я бы предпочел не выкапывать все элементы в строке html. - что вы подразумеваете под этим - выкопайте все элементы в html - изменит ли что-то кодирование/декодирование в этом вопросе? - person WTK; 01.09.2011
comment
Что ж, я отправляю на сервер кучу HTML-кода, и когда пользователь использует Firefox, href всех ссылок IDN кодируется, но не при использовании любого другого браузера. Это означает, что я должен взломать это, выкопав все теги A на стороне сервера и расшифровав их html (ура, регулярное выражение), если пользователь использует Firefox. - person Thomas Lundström; 01.09.2011
comment
Поэтому, прежде чем вы сохраните кучу HTML-кода в базе данных (я полагаю), декодируйте его на стороне сервера, чтобы избавиться от проблемы. Какую серверную технологию вы используете? - person WTK; 01.09.2011
comment
Да, это именно то, что я должен был сделать, так как кажется, что нет способа заставить Firefox делать то, что я хочу. - person Thomas Lundström; 02.09.2011