18

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

<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:URImalformed」が発生することです。

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で動作することを確認したいので、どうすればローカルWindowsで動作させることができますか?私はテストしましたが、これはuriの特殊文字のエンコード(「acções」という単語のように)が原因であることがわかりました。特殊文字でも機能させる方法はありますか?

これらの文字を削除してファイル/フォルダーの名前を変更するだけでこれを修正できることはわかっていますが、フォルダーの名前を再度変更することにした場合に備えて、よりクライアントに適したソリューションが必要です(そして、すべてがCABOOMになります) )。

4

6 に答える 6

17

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

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

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

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

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

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

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

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


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

于 2013-05-19T20:14:41.127 に答える
7

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

decodeURIComponent( unescape( unescape(s)) )

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

非UTF-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, "" ) ) ) );
}
于 2014-01-12T19:06:09.163 に答える
4

このようなもの ?

s = "file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1";
decodeURIComponent( unescape(s) )
于 2013-10-31T01:36:45.760 に答える
4

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

decodeURIComponent(encodeURIComponent(mystring))

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

于 2018-09-06T11:11:11.393 に答える
1

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

try {
    myVal = decodeURIComponent(sourceVal);
} catch (err) {
    myVal = "";
}
于 2015-12-06T09:56:23.910 に答える
-2

デモコードを切り取って、フォルダー名(新しいフォルダー)にtest1.htmlとしてスペースが含まれるフォルダーパスに保存されたメモ帳に貼り付けました。次に、test1.htmlをダブルクリックすると、夢のように機能しました。

あなたは明らかに何かを変更しました、そしてそれが何であれそれを元に戻すとそれはうまくいくでしょう。

于 2013-11-06T20:04:48.110 に答える