PHPとjQueryを使用しているので、最善の策は私のプロジェクトであるphery http://phery-php-ajax.netであり、これは積極的に保守されており、過去2年間改善してきました。
ビューを使用することで、サイトを個々のajaxビューにセグメント化するか、AJAXを介して本格的なページコンテンツを使用することができます。これはSEOに対応しており、イベントの委任を使用しているため、すべての新しい要素はすでに修正されています。履歴APIまたはハッシュイベントの使用は強制されません。最適な機能を決定できます。
あなたのサイトの本格的なAJAXローディングコンテンツは次のようになります(もちろん、コンテナのみ、メニュー、フッターなどは除外されます)
var ever_pushed = false; // needed for chrome
phery.view({
'#container': {
'exclude': ['/blog'], // exclude wordpress from it
'beforeSend': function(){
$('body,html').scrollTop(0); // go to the top
},
'render': function(html, data, passdata){
var $this = $(this);
nav_items.removeClass('current').filter('.' + data.controller).addClass('current'); // update the menu
document.title = data.title; // set the document title
/* Good browsers get history API */
if (typeof passdata['popstate'] === 'undefined') {
window.history.pushState(data, data.title, data.url);
ever_pushed = true;
}
_gaq.push(["_trackPageview"]); // Google analytics
$('#content')
.find('>div')
.animate({'opacity':0}, 375) // fadeout
.promise()
.done(function(){
$body.removeClass().addClass(data.body_class);
$this.html('').html(html);
on_reload(); // restart events that need to be bound on new elements
cufonize(true); //apply cufon
$('#content').find('>div').animate({'opacity':1}, 375); // fadein
});
}
}
});
$(window).bind('popstate', function(e){
if (!ever_pushed) {
return;
}
phery.view('#container').navigate_to(document.location.toString(), null, {'popstate':true}); // back and forward history buttons
});
同じコードの小さいバージョンは次のようになります。
$(function(){
var ever_pushed = false;
phery.view({
'#container': {
'afterHtml': function(html, data, passdata){
/* Good browsers get history API */
if (typeof passdata['popstate'] === 'undefined') {
window.history.pushState(data, data.title, data.url);
ever_pushed = true;
}
}
}
});
$(window).bind('popstate', function(e){
if (!ever_pushed) {
return;
}
phery.view('#container').navigate_to(document.location.toString(), null, {'popstate':true}); // back and forward history buttons
});
});
PHP側では、次のようになります。
function render_view($data, $params, $phery){
return PheryResponse::factory()->render_view(views_get_view('all_projects')->execute_display('Block', array()));
}
//...
public function render($reset = FALSE){
Phery::instance()->views(array(
'#container' => array($this, 'render_view')
))->process();
}
//...