OSS Web アプリには、Ajax 更新を実行する JS コードがあります (jQuery を使用しますが、関係ありません)。History.pushState
ページの更新後、次のコードでhtml5 history インターフェイスへの呼び出しが行われます。
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 部分はこの質問の問題ではありません]
アプリは国際化されており、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 エンコードされたセグメントは単なる文字化けであり、あるレベルで間違ったエンコードを使用した結果です。正しい 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 を使用する場合は、URL 形成のデフォルトの標準 (utf-8 やパーセント エンコーディングなど) が適用されると思います。
ここで何が起こっているかについての考え。
編集:
History の大文字の H には注意を払っていませんでした。このコードは、実際には history インターフェースにHistory.jsラッパーを使用しています。ラッパーを介さずに (小文字の h に注意してください)への直接呼び出しに置き換えましたhistory.pushState
。コードは、私が知る限り、期待どおりに機能しています。元のコードの問題はまだ残っているため、History.js ライブラリの問題のようです。