我正在尝试在我的Web应用程序中使用pushState,如下所示:
//default settings
var ds = {
path: window.module.Globals.prototype.base_url, //location misc variable for my app
type: 'POST',
dataType: 'html',
data: {},
target: 'main_swap_area',
pre_ajax_callback: function(scope){ console.log('pac'); },
post_success_callback: function(data, textStatus, jqXHR, scope){ console.log('psc'); },
scope: this
};
History.pushState(ds, 'Title 1', ds.path);
我有一个回调函数来监听'statechange
'事件
jQuery(window).bind('statechange',function(){
var
State = History.getState(),
url = State.url;
console.log(State); // State.data is object with all original properties EXCEPT properties that contained functions as values
}); // end onStateChange
我的控制台的输出是一个包含所有原始属性/值的对象,除了具有值函数的所有属性。为什么这些被丢弃/没有被退回?
答案 0 :(得分:3)
在某一时刻,许多pushState
实现使用JSON来序列化和反序列化对象。较新的浏览器版本使用名为the structured clone algorithm的内容。
在这两种情况下,都不支持Error
和Function
个对象,因此您无法将它们用作pushState
州的一部分。尝试这样做通常会导致DATA_CLONE_ERR异常,但错误事件可能不会冒泡。
如果你真的想存储一个函数,我看到结构化克隆算法支持Blob
克隆,所以你可以将你的函数加载为<script>
节点,可能存储这个文本blob作为本地商店的Blob
。您必须eval
才能使用它(如果使用不当可能会很危险),但即使不完全优雅,我也能看到类似的东西。
答案 1 :(得分:0)
只是想一想为什么不通过json传递函数名,如果它存在于数据中则创建一个新函数然后执行它
temp = new Function(State.data.pre_ajax_callback);
temp();