Я использую плагины Ben Almans jQuery BBQ и jQuery hashchange для ссылок на страницы. Оба работают должным образом в Opera и Firefox, но не в IE 8 (удивлены, да?). IE также хорошо работает с ajax, кнопкой возврата и hashchange, но не работает, когда я нажимаю кнопку перезагрузки и показывает необработанный ответ ajax вместо запуска его на ранее загруженной странице.
Вот мой уродливый код и некоторые пояснения к функциям, которые я пытаюсь реализовать в моей разбивке на страницы:
1) Ссылки, удобные для поисковых систем (сервер отвечает html или js в зависимости от доступности javascript на стороне клиента).
2) Динамически изменяемый URL-адрес при включении JS (с использованием символа '#').
3) Поддержка истории и кнопки возврата.
4) Минимизация двойных запросов (не выполняйте запросы ajax, если тот же контент был загружен html).
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):
<%= image_tag "spinner.gif" %>
<%= render "products_list.erb" %>
Шаблон AJAX (представление Rails js):
$('#products').html('<%= escape_javascript(render "products_list") %>').css('opacity', '1');
UPD: IE не отправляет заголовок типа запроса (или Rails не может его определить) пока освежает. Таким образом, Rails генерирует JS-представление вместо HTML. Решено:
respond_to do |format|
request.format.js? ? (format.js {render :index}) : (format.html {render :index})
end
Есть ли лучшее решение?