私はhistory.jsを使用してサイトを更新していますが、これはうまく機能しています。これはPHPベースのWebショップであり、ajaxリクエストを検出した場合、メインのdivのデータでのみJSONを提供します。
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {}
ロード時に、history.jsのgithubから採用したアプローチであるリンクをajaxifyします:https ://github.com/browserstate/History.js/
function ajaxify() {
var History = window.History;
$('a[rel="ajax"]').click(function(e){
if(History.enabled) {
e.preventDefault();
var url = $(this).attr("href");
var options = {};
History.pushState(null, 'Shop', url);
}
else {
window.location.replace(url);
}
});
}
イベントハンドラは次のとおりです。
History.Adapter.bind(window,'statechange',function(){
var State = History.getState();
var returnLocation = history.location || document.location;
var url = returnLocation.pathname;
var options = searchString(returnLocation.search);
shopUpdate(url,options)
});
そしてこれはajax呼び出しです:
function shopUpdate(url,options) {
$.ajax({
url: url,
type: "GET",
dataType:'json',
data: options,
success: function(data, textStatus, jqXHR){
$('#shop').html(data.page);
ajaxify();
}
});
}
すべてを壊すシナリオがあります。一部のリンクは「ajaxified」ではなく、いくつかのajaxリンクをクリックすると、「通常の」リンク、「戻る」の順に、生のJSON出力が得られます。URLは正しいので、リロードすると、必要なページが表示されます。PHPがAjaxであると考えてJSONを提供しているようですが、通常のリンクを介してそこに到達したため、Historyの状態変更は発生しません。私はかなり混乱していて、どんな助けにも感謝します!
ありがとう、トーマス