В веб-приложении OSS у нас есть JS-код, который выполняет некоторое обновление Ajax (использует 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-кодированные Unicode-сегменты в URL-адресах, поэтому непосредственно перед помеченным вызовом проблемы в приведенном выше коде аргумент 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.
Интерфейс истории specs ничего не упоминает о кодированных URL-адресах, но я предполагаю стандарт по умолчанию для формирования URL-адреса (utf-8 и процентное кодирование и т.д.) будут применяться при использовании URL-адреса в вызовах функций для интерфейса.
Любая идея о том, что происходит здесь.
Изменить:
Я не обращал внимания на верхний регистр H в истории - этот код фактически использует обертку History.js для интерфейса истории. Я заменил прямой вызов History.pushState
(обратите внимание на нижний регистр h), не пройдя через обертку, и код работает как ожидалось, насколько я могу судить. Проблема с исходным кодом все еще стоит - так что проблема с библиотекой History.js кажется.