Location.Hash не обновляется в Chrome - PullRequest
3 голосов
/ 25 января 2011

Я пытаюсь сохранить состояние страницы в хэше. Это работает в IE и FF, но в Chrome, похоже, ничего не делает

$(document).ready(function()
{
    window.onbeforeunload = savePageState;
});

function savePageState()
{
    var currentTab = _tabbing.getCurrentTab();

    var mapState = _mapAdapter.getMapState();
    window.location.hash =
        'reload=' + currentTab +
        '&mapType=' + mapState.MapType.getName() +
        '&lat=' + mapState.Latitude +
        '&long=' + mapState.Longitude +
        '&zoom=' + mapState.ZoomLevel;

    return;
}

Есть ли в Chrome особенность, которая мешает мне обновить хэш? Есть ли лучший способ сохранить состояние страниц? Его нужно сохранить только для кнопки «назад».

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Я бы порекомендовал вам использовать jQuery BBQ плагин , который управляет хешем для вас.

$.bbq.pushState({
    reload: currentTab,
    mapType: mapState.MapType.getName(),
    lat: mapState.Latitude,
    long: mapState.Longitude,
    zoom: mapState.ZoomLevel
});

BBQ обрабатывает слияние хэша, поэтому он не будет перезаписывать другие параметры. Например, #fun=yes становится #fun=yes&reload=tab&...

Далее вы можете прослушать изменения в хэше:

$(window).bind('hashchange', function(e) {
    var params = e.getState();
    doStuff(params.lat, params.long);
});
1 голос
/ 01 февраля 2011

Хотя барбекю было приятно, это не полностью решило мою проблему. Чтобы это работало в Chrome / Safari, вам нужно обновить хеш до события onbeforeunload. Часть требования, однако, сделала это так, что это было единственное реальное время, когда я мог сохранить состояние страницы.

Я придумал решение, используя оба других ответа здесь, используя pushState и BBQ. Я думал, что отправлю это, если у кого-то еще будет та же самая проблема, которую я сделал.

function BackButtonState(saveStateCallback, pageLoadCallback)
{
    var executePopStateCounter = null;
    var myData = {};
    var browserCanPushState = history.pushState ? true : false;

    window.onbeforeunload = saveStateCallback;

    if (browserCanPushState)
    {
        //The version of safari this was tested on (5.0.3) uses an outdated version of
        //Webkit that has a bug where popstate is not called on the first page load.
        //This is a hacky work around until the problem is fixed.
        var agt = navigator.userAgent.toLowerCase();
        if (agt.indexOf("safari") != -1)
        {
            executePopStateCounter = setTimeout(pageLoadCallback, 500);
        };

        window.onpopstate = function(popEvent)
        {
            clearTimeout(executePopStateCounter);
            if (popEvent.state != null)
            {
                myData = popEvent.state;
            }
            pageLoadCallback();
        }
    }
    else
    {
        $(document).ready(pageLoadCallback);
    }

    this.savePageState = function(state)
    {
        if (browserCanPushState)
        {
            history.pushState(state, 'BackButtonState');
        }
        else
        {
            $.bbq.pushState(state);
        }
    }

    this.getState = function(item)
    {
        if (browserCanPushState)
        {
            return myData[item];
        }
        else
        {
            return $.bbq.getState(item);
        }
    }

    this.deserializeSortList = function(sortArrays)
    {
        var sortList = [];

        $.each(sortArrays, function(index, pair)
        {
            sortList.push([parseInt(pair[0]), parseInt(pair[1])]);
        });

        return sortList;
    }
}

Чтобы использовать это, вы делаете что-то вроде:

function saveState()
{
    var myData = { bananas: 'are tasty' };
    _backButton.saveState(myData);

}

function pageSetup()
{
    //Do normal $(document).ready() stuff here
    var myOpinionOnFruit = _backButton.getState('bananas');
}

var _backButton = new BackButtonState(saveState, pageSetup);

Это не гарантирует отсутствие ошибок, и я недоволен взломом, который я должен был сделать для Safari. Я просто хотел опубликовать это, прежде чем забыл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...