ページネーション リンクでは、Ben Almans の jQuery BBQ および jQuery hashchange プラグインを使用しています。どちらも Opera と Firefox では期待どおりに動作しますが、IE 8 では動作しません (驚いたでしょう?)。IE は ajax、戻るボタン、hashchange でもうまく機能しますが、リロード ボタンをクリックすると失敗し、以前に読み込まれたページで実行する代わりに生の ajax応答が表示されます。
したがって、ここに私の醜いコードと、ページネーションに実装しようとしている機能に関するいくつかの説明があります。
1) 検索エンジンに適したリンク (サーバーは、クライアント側の JavaScript の可用性に応じて、html または js に応答します)。
2) JS がオンになっている場合に動的に変更可能な URL (「#」記号を使用)。
3) 履歴と戻るボタンのサポート。
4) 二重リクエストの最小化 (同じコンテンツが html ページでロードされた場合、ajax リクエストを行わないでください)。
JS:
$(function ($) {
if (ajax_init) {
$('.pagination a').live("click", function () {
$.bbq.pushState({page: $.deparam.querystring($(this).attr('href')).page});
return false;
});
$(window).bind("hashchange", function(e) {
var anchor = $.deparam.fragment().page;
var query = $.deparam.querystring().page;
if (ajax_load(anchor, query)) {
$(ajax_div).css('opacity', '0.4');
$(ajax_div + '-processing').removeClass('hidden');
$.ajax({
type: 'GET',
url: $.param.querystring('', {page: anchor}),
dataType: 'script',
cache: false
});
}
});
$(window).trigger('hashchange');
}
});
function ajax_load(anchor, query) {
if ((anchor && anchor !== query && !(!query && anchor == 1)) || $('#noscript').length < 1) {
return true;
}
else {
return false;
}
}
テンプレート (Rails ビュー):
<div id="products-container" >
<div id="products-processing" class="hidden">
<%= image_tag "spinner.gif" %>
</div>
<div id="products">
<div id="noscript">
<%= render "products_list.erb" %>
</div>
<script type="text/javascript">
var ajax_init = true;
var ajax_div = '#products';
var anchor = $.deparam.fragment().page;
var query = $.deparam.querystring().page;
if (!ajax_load(anchor, query)) {
url = anchor ? anchor : (query ? query : 1);
$.bbq.pushState({page: url});
}
else {
$('#noscript').hide();
$('#products-processing').removeClass('hidden');
}
</script>
</div>
<div id="products-min-height"></div>
</div>
AJAX テンプレート (Rails js ビュー):
$('#products').html('<%= escape_javascript(render "products_list") %>').css('opacity', '1');
UPD:更新中に IE がリクエスト タイプ ヘッダーを送信しない (または Rails が判断できない)。そのため、Rails は HTML ではなく JS ビューを生成します。解決方法:
respond_to do |format|
request.format.js? ? (format.js {render :index}) : (format.html {render :index})
end
より良い解決策はありますか?