HTML5 pushState с использованием History.js. Проблемы с получением данных из State.data - PullRequest
7 голосов
/ 29 февраля 2012

Я могу установить данные в State.data of History.js, например:

var pushStateData = {};

function RetrieveSearchResults(type, url, searchData) {//, showResetButton, 
controlToFocus, navDirection) {

    pushStateData = {
        SearchType : type,
        SearchData : searchData,
    };

    RetrievePageResults(true, url, pushStateData);
}

function RetrievePageResults(pushNewUrl, url, pushStateData) {
    navigationInProgress = true;
    if (pushNewUrl) {
        if (window.History) {
                window.History.pushState(pushStateData, null, url);                                            
        }

        $.get(url, pushStateData.SearchData, function (reply) {
            $("#search-results").html(reply);
            navigationInProgress = false;            
        });
    }

Если я установлю точку останова в операторе window.History.pushState, в Chrome я могу четко видетьpushStateData имеет желаемые значения.

Однако, когда я пытаюсь получить данные:

$(window).bind("statechange", function (e) {
        if (!navigationInProgress) { 
            var State = window.History.getState();

            if (window.console && window.console.log) {
                console.log("popstate", State, window.location.href);
            }

            RetrievePageResults(false, State.cleanUrl, State.data);
        }
    });

Когда я устанавливаю точку останова в операторе RetrievePageResults, объект State.data больше не имеет никаких значений, которые я установил.State.data определен и не является нулевым, но это пустой объект без каких-либо видимых значений.

Спасибо, Скотт

1 Ответ

5 голосов
/ 12 августа 2012

Я не вижу ничего плохого в State.data, когда вы запускаете pushState, обязательно вызывайте метод History.js:

History.pushState({state:1}, "State 1", "?state=1");

Где:

  • Первый параметр => Данные
  • Второй параметр => Имя
  • Третий параметр => URL

Похоже, вы не передали состояние, аданные будут присутствовать только тогда и только тогда, когда вы вызовете History.pushState.Когда вы посещаете URL-адрес напрямую (/? State = 1), у вас не будет данных в состоянии, данные будут доступны только при перемещении назад / вперед и при перемещении состояния через History.pushState.

sideпримечание : убедитесь, что ваша переменная navigationInProgress зафиксирована, вы не хотите, чтобы она там зависала.Сбросьте его при сбое запроса $ .get при прослушивании обратного вызова с ошибкой.И когда ваш pushNewUrl имеет значение false, сбросьте атрибут navigationInProgress.

...