it-swarm.com.ru

Uncaught URIError: URI искажен - вкладки пользовательского интерфейса 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"). Есть ли способ заставить его работать даже со специальными символами?

Я знаю, что могу это исправить, просто удалив эти символы и переименовав файл/папку, но я хотел бы иметь решение, которое является более надежным для клиента в случае, если они решат переименовать папки снова (и все просто идет CABOOM на их лицах ).

18
Catarina Lou

Это является следствием метода decodeURIComponent, который предполагает, что байты, закодированные в процентах данной строки, находятся в UTF-8 (см. Шаг 4.d.vii.8 операции Decode в разделе 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.


Кроме того, где ваша примерная строка появляется на ваших веб-страницах? Как это генерируется? В каком браузере вы тестировали поведение? Ответ поможет мне сказать вам, что делать.

14
Peter O.

Это ошибка в jquery - http://bugs.jqueryui.com/ticket/9518 - присутствует для URL не-UTF8. У меня была такая же проблема и я ее решил. Поскольку я не мог изменить кодировку своей страницы на UTF-8, я наконец исправил свой jqueryui и использовал решение Rainer Plumer в качестве обходного пути, но мне пришлось использовать его дважды, потому что у меня есть некоторые параметры URI, которые содержат закодированные URI. Так что мое решение было 

decodeURIComponent( unescape( unescape(s)) )

В более общем случае, вероятно, должен быть цикл повторения до, продолжающийся до тех пор, пока вы не получите тот же результат. Этот обходной путь не является чистым решением наверняка. Чистое решение спрашивается здесь: 

Отправить форму с методом 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, "" ) ) ) );
}
5
TMS

У меня была та же ошибка «Uncaught URIError: URI malformed», и я исправил ее, выполнив:

decodeURIComponent(encodeURIComponent(mystring))

NB: изменение кодировки моей страницы в UTF-8 или добавление unescape () не работало для меня.

3
Sebastien Cornu

Что-то вроде этого ?

s = "file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1";
decodeURIComponent( unescape(s) )
3
Rainer Plumer

У меня была эта проблема сама. Я не смог найти способ очистить исходную строку, поэтому я просто обошел исключение, чтобы данные продолжали загружаться .. Надеюсь, это поможет.

try {
    myVal = decodeURIComponent(sourceVal);
} catch (err) {
    myVal = "";
}
0
Aryeh Beitz