Проблемы с хэш-обменом URL с загрузкой ajax
У меня есть функциональная тема WordPress, которая загружает контент через AJAX. Однако у меня возникает одна проблема: когда страницы загружаются напрямую, сценарий ajax больше не работает. Например, структура ссылок работает следующим образом, в то время как на веб-сайте www.example.com и при щелчке ссылки на странице about ссылка становится www.example.com/#/about. Но когда я непосредственно загружаю отдельную страницу www.example.com/about, другие ссылки, нажимаемые на этой странице, превращаются в www.example.com/about/#/otherlinks. Я немного изменил код из этого учебника http://www.deluxeblogtips.com/2010/05/how-to-ajaxify-wordpress-theme.html. Вот мой код Спасибо за помощь.
jQuery(document).ready(function($) {
var $mainContent = $("#container"),
siteUrl = "http://" + top.location.host.toString(),
url = '';
$(document).delegate("a[href^='"+siteUrl+"']:not([href*=/wp-admin/]):not([href*=/wp-login.php]):not([href$=/feed/]))", "click", function() {
location.hash = this.pathname;
return false;
});
$(window).bind('hashchange', function(){
url = window.location.hash.substring(1);
if (!url) {
return;
}
url = url + " #ajaxContent";
$mainContent.fadeOut(function() {
$mainContent.load(url,function(){
$mainContent.fadeIn();
});
});
});
$(window).trigger('hashchange');
});
1 ответ
Проблема, которую вы выражаете, не легко решается. На карту поставлено несколько факторов, но все сводится к следующему:
- Любые изменения в URL приведут к перезагрузке страницы
- Единственное исключение, если изменяется только хэш-часть URL
Как вы можете заметить, в URL нет хеш-части www.example.com/about/. Следовательно, эта часть не может быть изменена вашим скриптом, иначе она вызовет перезагрузку страницы.
Зная об этом факте, ваш сценарий будет изменять URL-адрес только путем добавления новой части хеш-функции или изменения существующей, оставляя при этом часть URL-адреса "pathname". И так вы получите URL-адреса, такие как www.example.com/about/#/otherlinks.
Теперь, с моей точки зрения, есть два способа решения вашей проблемы.
Во-первых, есть API, который может изменить весь URL-адрес без перезагрузки, но он доступен не везде. Использование этого решения и возврат к классической перезагрузке страницы для старого браузера - более чистый метод.
Иначе, вы можете принудительно перезагрузить страницу, чтобы сбросить URL-адрес до www.example.com/ и начать с хорошей основы. Вот код для этого:
$(document).delegate("a[href^='"+siteUrl+"']:not([href*=/wp-admin/]):not([href*=/wp-login.php]):not([href$=/feed/]))", "click", function() {
location = location.assign('#' + this.pathname);
return false;
});
Следует отметить, что этот скрипт не будет работать, если ваш сайт не находится в корне пути. Таким образом, чтобы он работал для www.example.com/mysite/, вам понадобятся изменения в регулярном выражении.
Пожалуйста, дайте мне знать, как все прошло.