Хотя барбекю было приятно, это не полностью решило мою проблему. Чтобы это работало в 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. Я просто хотел опубликовать это, прежде чем забыл.