Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 и работал как сон.

Вы явно что-то изменили, и что бы это ни изменило, он будет работать нормально.