Нет, это невозможно, во всяком случае, напрямую. Согласно MDC «объект состояния», то есть первый аргумент pushState
, «может быть любым, что может быть сериализовано». К сожалению, вы не можете сериализовать функцию. Спецификация WHATWG говорит в основном то же самое, но во многих других словах, суть которых в том, что функции явно запрещены в объекте состояния.
Решением было бы сохранить либо строку, которую вы можете eval
, либо имя функции в объекте состояния, например ::
.
$(window).bind("popstate", function(event) {
var state = event.originalEvent.state;
if ( !state ) { return; }
window[ state.callback ]( state.argument ); // <-- look here
}
function beforeLoad() {
var resourceId = "xyz",
func
;
if ( case1 ) {
func = "switchPageToMode1"; // <-- string, not function
} else {
// case 2
func = "swithPageToMode2";
}
window[ func ]( resourceId ); // <-- same here
window.history.pushState(
{ callback : func,
argument : resourceId
},
"newTitle", "newURL"
);
}
Конечно, предполагается, что switchPageToMode1
и -2
находятся в глобальном контексте (т.е. window
), что не является наилучшей практикой. Если нет, то они должны быть как-то доступны из глобального контекста, например [window.]MyAppGlobal.switchPageToMode1
, в этом случае вы бы позвонили MyAppGlobal[ func ]( argument )
.