#javascript #jquery
#javascript #jquery
Вопрос:
Я наткнулся history.js в качестве возможного решения некоторых проблем, которые у меня возникают. Для веб-сайта, который я создаю, я решил создать статическую страницу, на которую будет загружаться мой контент. Итак, у меня было бы 3 раздела (один для заголовка, один для строки меню и один для содержимого) При нажатии на ссылку в меню эта страница будет загружена в раздел содержимого. Из-за этого весь трафик остается в index.php страница, поэтому, нажав на кнопку «Назад», я бы перешел к последнему посещенному контенту, но к последней посещенной странице. Насколько я понимаю, я могу решить это с помощью history.js .
Итак, на моей странице у меня есть несколько ссылок в строке меню, где вызывается функция onclick. Например
<li><a href="javascript:void(0);" onclick="myprofile()" ><span>my profile</span></a></li>
<li><a href="javascript:void(0);" onclick="mysettings()"><span>Settings<small>
Функция будет выглядеть примерно так.
function myprofile() {
$('#content').load('members.php');
}
function mysettings() {
$('#content').load('settings.php');
}
Я добавил немного javascript для history.js (найдено на этом форуме) И хотя это изменяет URL-адреса внутри моего index.php но при обратном нажатии он не загружает страницы. Как бы я позволил history.js работать, когда используются функции? (некоторые ссылки, в которых мне действительно нужны функции, поэтому простое включение загрузки внутри ссылки не было бы для меня вариантом)
<script>
$(function() {
// Prepare
var History = window.History; // Note: We are using a capital H instead of a lower h
if ( !History.enabled ) {
// History.js is disabled for this browser.
// This is because we can optionally choose to support HTML4 browsers or not.
return false;
}
// Bind to StateChange Event
History.Adapter.bind(window,'statechange',function() { // Note: We are using statechange instead of popstate
var State = History.getState();
$('#content').load(State.url);
/* Instead of the line above, you could run the code below if the url returns the whole page instead of just the content (assuming it has a `#content`):
$.get(State.url, function(response) {
$('#content').html($(response).find('#content').html()); });
*/
});
// Capture all the links to push their url to the history stack and trigger the StateChange Event
$('a').click(function(evt) {
evt.preventDefault();
History.pushState(null, $(this).text(), $(this).attr('onclick'));
});
});
</script>
Комментарии:
1. Вы проверили свой javascript в отладчике? Где это ошибка? Или где это происходит, прежде чем оно начнет действовать по-другому?
2. Ну, это меняет адрес в верхней строке на site.com/myprofile () это неверный адрес
3. Измените свой вызов pushState на: «History.pushState(null, $(this).text(), ‘members.php ‘);» поскольку 3-м параметром является URL-адрес, и похоже, что событие javascript «onclick» добавляется в историю вместо URL-адреса, который вы на самом деле хотите /нужно.
4. Возможно, вы также захотите обновить href (или другой html-атрибут) ссылки (в вашем фактическом html), чтобы вы могли просто выполнить $(this).attr(‘href’) или $(this).attr(‘data-href’), поскольку выполняется обработка pushState.сделано для всех ссылок.
5. Вы можете использовать атрибут «data», первый параметр History.pushState . Итак, чтобы сохранить запись истории, вы можете сделать «History.pushState({ href: ‘members.php ‘ }, $(this).text(), $ (this).attr(‘onclick’));» а затем, читая его обратно, вы бы сделали: «$ (‘#content’).load(State.data.href);»
Ответ №1:
Первым параметром History.pushState является «data», который предназначен для получения дополнительной информации.
Итак, чтобы сохранить запись истории, вы можете сделать это в своем событии click:
History.pushState({ href: 'members.php' }, $(this).text(), $(this).attr('onclick'));
А затем, когда вы читаете его обратно, вы должны сделать это в своей истории.Функция Adapter.bind:
$('#content').load(State.data.href);