web-dev-qa-db-ja.com

Uncaught URIError:URI malformed-Windowsのjquery UIタブ

ローカルのWindows開発環境でjquery UIタブを使用しています。私は彼らの デモコード でテストしています

<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>

問題は、この関数で「キャッチされていないURIError:URIの形式が正しくありません」ということです。

function isLocal( anchor ) {
    return anchor.hash.length > 1 &&
        decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
Uncaught URIError: URI malformed
            decodeURIComponent( location.href.replace( rhash, "" ) );
} 

これは、次のようなWindows環境のURIが原因であると思われます。

file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1

クライアントがライブに移行する前にそこで動作することを確認したいので、ローカルWindowsでどのように動作させることができますか?私はテストしましたが、これはURIの特殊文字のエンコード(Wordの「acções」など)が原因であることがわかります。 特殊文字でも機能させる方法はありますか?

私はこれらの文字を削除してファイル/フォルダーの名前を変更するだけでこれを修正できることを知っていますが、彼らがフォルダーの名前を再度変更することに決めた場合に備えて、よりクライアントに証明される解決策が欲しいです)。

18
Catarina Lou

これは、decodeURIComponentメソッドの結果です。このメソッドは、指定された文字列のパーセントエンコードバイトがUTF-8であると想定します(セクション15.1.3の デコード操作 のステップ4.d.vii.8を参照)。 ECMAScriptの)。あなたの例の文字列:

"file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1"

パーセントデコードされたバイト0xE7 0xF5が含まれています。これは、有効なUTF-8文字列で次々と発生することはありません(Windows-1252では2つの文字çõを表します)。したがって、decodeURIComponentはURIError例外をスローします。

これを解決する1つの方法は、まだテストしていませんが、WebページがデフォルトのISO-8859-1ではなく、UTF-8文字エンコーディングを使用して提供されるようにすることです。

これを行うには、次のようにMETAタグを含めます。

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

(理想的には、文字セットを含むContent-Typeヘッダーを含めることですが、これは一般に、ファイルシステムを含むローカルテストでは不可能です。)

また、Webページ自体がUTF-8でエンコードされていることも確認してください。


また、サンプル文字列はWebページのどこに表示されますか?どのように生成されますか?どのブラウザで動作をテストしましたか?答えは私があなたに何をすべきかを教えるのに役立ちます。

15
Peter O.

これはjqueryのバグです- http://bugs.jqueryui.com/ticket/9518 -非UTF8 URLに存在します。私は同じ問題を抱えてそれを解決しました。ページのエンコードをUTF-8に変更できなかったので、ようやくjqueryuiにパッチを適用し、回避策としてRainer Plumerのソリューションを使用しましたが、エンコードされたURIを含むURIパラメーターがあるため、2回使用する必要がありました。だから私の解決策は

decodeURIComponent( unescape( unescape(s)) )

より一般的には、おそらく同じ結果が得られるまでエスケープを解除して、ループが繰り返されるまで繰り返す必要があります。この回避策は確かにクリーンなソリューションではありません。きれいな解決策はここで尋ねられます:

TF-8以外のエンコーディングでgetメソッドを使用してフォームを送信

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, "" ) ) ) );
}
6
TMS

同じエラー「Uncaught URIError:URI malformed」があり、次のようにして修正しました:

decodeURIComponent(encodeURIComponent(mystring))

注意:ページのエンコーディングをUTF-8に変更したり、unescape()を追加したりしてもうまくいきませんでした。

4
Sebastien Cornu

このようなもの ?

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

私自身もこの問題を抱えていました。ソース文字列をクリーンアップする方法が見つからなかったため、例外をバイパスして、データの読み込みを続行しました。お役に立てれば。

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