HTML5 pushState с использованием History.js. Не удалось получить данные из State.data.

Я могу установить данные в State.data 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 определен и не равен нулю, но это пустой объект без видимых значений.

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


person sveatch42    schedule 29.02.2012    source источник


Ответы (1)


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

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

Где:

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

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

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

person Mohamed Mansour    schedule 11.08.2012
comment
Спасибо, Мохамед, пожалуйста, я хочу спросить вас, использовали ли вы когда-нибудь в третьем параметре pushState URL-адрес, содержащий арабские слова. stackoverflow.com/ вопросы/16259226/ - person Adib Aroui; 28.04.2013
comment
У меня та же проблема, и мне удается отправить только параметр состояния в данных, и если я попытаюсь сохранить что-либо еще, я не смогу его восстановить. Я думаю, это был вопрос - person Mladen Janjetovic; 29.01.2015