在 OSS Web 应用程序中,我们有执行一些 Ajax 更新的 JS 代码(使用 jQuery,不相关)。页面更新后,调用 html5 历史接口History.pushState
,代码如下:
var updateHistory = function(url) {
var context = { state:1, rand:Math.random() };
/* -----> bedfore the problem call <------- */
History.pushState( context, "Questions", url );
/* -----> after the problem call <------- */
setTimeout(function (){
/* HACK: For some weird reson, sometimes something overrides the above pushState so we re-aplly it
This might be caused by some other JS plugin.
The delay of 10msec allows the other plugin to override the URL.
*/
History.replaceState( context, "Questions", url );
}, 10);
};
[请注意:为上下文提供了完整的代码段,HACK 部分不是这个问题的问题]
该应用程序是 i18n'ed 并且在 URL 中使用 URL 编码的 Unicode 段,因此就在上述代码中标记的问题调用之前,URL 参数包含(在 Firebug 中检查):
"/%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9/scope:all/sort:activity-desc/page:1/"
编码段是 utf-8 百分比编码。浏览器窗口中的 URL 是:(只是为了完整性,并不重要)
http://<base-url>/%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9/
调用后,浏览器窗口中显示的 URL 变为:
http://<base-url>/%C3%98%C2%A7%C3%99%C2%84%C3%98%C2%A3%C3%98%C2%B3%C3%98%C2%A6%C3%99%C2%84%C3%98%C2%A9/scope:all/sort:activity-desc/page:1/
URL 编码段只是 mojibake,在某种程度上使用错误编码的结果。正确的 URL 应该是:
http://<base-url>/%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9/scope:all/sort:activity-desc/page:1/
此行为已在 FF 和 Chrome 上进行了测试。
历史接口规范没有提到任何关于编码 URL 的内容,但我假设 URL 形成的默认标准(utf-8 和百分比编码等)在使用接口的函数调用中的 URL 时将适用。
关于这里发生的事情的任何想法。
编辑:
我没有注意 History 中的大写 H - 此代码实际上使用History.js包装器作为历史接口。我替换为直接调用history.pushState
(注意小写的 h)而不通过包装器,据我所知,代码按预期工作。原始代码的问题仍然存在 - 所以 History.js 库似乎存在问题。