Ответ 1
По умолчанию pjax ожидает, что новые страницы будут доставлены без chrome - фрагмента HTML, который будет использоваться как innerHTML контейнера.
В вашем примере контейнер будет первым тегом <section>
, который я предполагаю. Я не знаю, гарантирует ли pjax, что он будет использовать первый элемент, соответствующий селектору, - он может просто заменить каждый соответствующий элемент.
Вероятно, было бы лучше использовать селектор ID, например #main
.
В любом случае, похоже, что вы не доставляли фрагменты HTML, а только целую страницу. Это почти побеждает цель pjax, но ее можно поддерживать, указав фрагмент в загруженном контенте. Почти всегда это будет селектор, который соответствует контейнеру, который будет заменен.
Итак, если вы используете контейнер с @id=main
, вы можете вызвать pjax с помощью
$(function() { $("ul a").pjax("#main", { fragment: "#main" }); });
Убедитесь, что pjax вызывается после загрузки документа, иначе поиск контейнера завершится неудачно.
Кстати, более простой способ переключиться на pushState с помощью навигации - это проект HTMLDecor. Это требует, чтобы вы изменили свою перспективу при создании HTML-страниц, но как только вы это сделали, вам просто нужно добавить HTMLDecor.js script на свои страницы, а pushState будет использоваться автоматически, если это необходимо - не требуется настройка.