18

我在本地 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 上的特殊字符的编码引起的(比如单词“acções”)。有没有办法让它即使使用特殊字符也能正常工作

我知道我可以简单地通过删除这些字符并重命名文件/文件夹来解决这个问题,但我希望有一个更适合客户的解决方案,以防他们决定再次重命名文件夹(一切都只是在他们的脸上出现了 CABOOM )。

4

6 回答 6

17

这是 decodeURIComponent 方法的结果,该方法假定给定字符串的百分比编码字节采用 UTF-8 格式(参见ECMAScript 第 15.1.3 节中解码操作的步骤 4.d.vii.8)。您的示例字符串:

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

包含百分比解码的字节 0xE7 0xF5,它们不能在有效的 UTF-8 字符串中一个接一个地出现(它们代表çõWindows-1252 中的两个字符)。因此,decodeURIComponent 会引发 URIError 异常。

解决这个问题的一种方法(我还没有测试过)是确保您的网页使用 UTF-8 字符编码而不是 UTF-8 字符编码提供服务,ISO-8859-1我认为这是默认设置。

为此,请包含如下 META 标记:

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

(虽然理想的做法是包含一个包含字符集的 Content-Type 标头,但这在涉及文件系统的本地测试中通常是不可能的。)

并确保网页本身以 UTF-8 编码。


此外,您的示例字符串出现在网页的什么位置?它是如何产生的?您在哪个浏览器上测试了该行为?答案将帮助我告诉你该怎么做。

于 2013-05-19T20:14:41.127 回答
7

这是 jquery 中的一个错误 - http://bugs.jqueryui.com/ticket/9518 - 存在于非 UTF8 URL。我有同样的问题并解决了它。由于我无法将页面的编码更改为 UTF-8,我最终修补了我的 jqueryui 并使用 Rainer Plumer 的解决方案作为解决方法,但我不得不使用它两次,因为我有一些包含编码 URI 的 URI 参数。所以我的解决方案是

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

我遇到了同样的错误“未捕获的 URIError:URI 格式错误”,我通过以下方式修复了它:

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