Uncaught URIError: URI malformed - вкладки пользовательского интерфейса jquery в Windows
Я использую вкладки пользовательского интерфейса jquery в локальной среде разработки Windows. Я тестирую демонстрационный код
<div id="tabs">
<ul>
<li><a href="#tabs-1">Nunc tincidunt</a></li>
<li><a href="#tabs-2">Proin dolor</a></li>
<li><a href="#tabs-3">Aenean lacinia</a></li>
</ul>
<div id="tabs-1">
<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. </p>
</div>
<div id="tabs-2">
<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie</p>
</div>
<div id="tabs-3">
<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede ve</p>
</div>
</div>
Проблема в том, что я получаю "Uncaught URIError: URI malformed" в этой функции:
function isLocal( anchor ) {
return anchor.hash.length > 1 &&
decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
Uncaught URIError: URI malformed
decodeURIComponent( location.href.replace( rhash, "" ) );
}
Я подозреваю, что это связано с URI в среде Windows, которая выглядит так:
file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1
Как я могу заставить его работать в локальной Windows, так как мои клиенты захотят увидеть, как он работает там, прежде чем отправиться жить? Я тестировал, и я знаю, что это вызвано кодировкой специальных символов на uri (например, на слове "acções" ). Есть ли способ заставить его работать даже со специальными символами?
Я знаю, что могу исправить это просто, удалив эти символы и переименовав файл/папку, но я хотел бы иметь решение, более надежное для клиента, если они решают переименовать папки снова (и все просто идет КАБИНА на их лицах).
Ответы
Ответ 1
Это является следствием метода decodeURIComponent, который предполагает, что заданные байты, закодированные в процентах, находятся в UTF-8 (см. шаг 4.d.vii.8 Операция декодирования в разделе 15.1.3 ECMAScript). Ваша строка примера:
"file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1"
Содержит процентные декодированные байты 0xE7 0xF5, которые не могут встречаться один за другим в правильной строке UTF-8 (они представляют два символа çõ
в Windows-1252). Соответственно, decodeURIComponent генерирует исключение URIError.
Один из способов решения этого вопроса, который я еще не тестировал, - обеспечить, чтобы ваша веб-страница была использована с использованием кодировки символов UTF-8, а не ISO-8859-1
, которая, как я полагаю, является значением по умолчанию.
Чтобы сделать это, включите тег META следующим образом:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
(Хотя идеальным является включение заголовка Content-Type, содержащего кодировку, это обычно не возможно при локальном тестировании с использованием файловой системы.)
А также убедитесь, что сами веб-страницы закодированы в UTF-8.
Также, где ваша строка примера отображается на ваших веб-страницах? Как это происходит? В каком браузере вы тестировали поведение? Ответ поможет мне рассказать вам, что делать.
Ответ 2
Это ошибка в jquery - http://bugs.jqueryui.com/ticket/9518 - присутствует для URL-адресов, отличных от UTF8. У меня была такая же проблема и она была решена. Поскольку я не мог изменить кодировку своей страницы на UTF-8, я, наконец, исправил свой jqueryui и использовал решение Rainer Plumer в качестве обходного пути, но мне пришлось использовать его дважды, потому что у меня есть некоторые параметры URI, которые содержат кодированные URI. Поэтому мое решение было
decodeURIComponent( unescape( unescape(s)) )
В более общем плане, вероятно, должен быть цикл repeat-until, unescaping, пока вы не получите тот же результат. Это обходное решение не является чистым решением. Здесь предлагается чистое решение:
Отправить форму с методом get в кодировке не UTF-8
PS: весь патч jquery UI:
function isLocal( anchor ) {
return anchor.hash.length > 1 &&
decodeURIComponent( unescape( unescape( anchor.href.replace( rhash, "" ) ) ) ) ===
decodeURIComponent( unescape( unescape( location.href.replace( rhash, "" ) ) ) );
}
Ответ 3
Что-то вроде этого?
s = "file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1";
decodeURIComponent( unescape(s) )
Ответ 4
У меня была эта проблема. Я не мог найти способ очистить исходную строку, поэтому я просто обошел исключение, поэтому данные будут продолжать загружаться.
Надеюсь, это поможет.
try {
myVal = decodeURIComponent(sourceVal);
} catch (err) {
myVal = "";
}
Ответ 5
Я вырезал и вставил демо-код в блокнот, сохраненный в пути к папке, в котором было место в имени папки (новая папка) как test1.html. Затем я дважды щелкнул test1.html и работал как сон.
Вы явно что-то изменили, и что бы это ни изменило, он будет работать нормально.