historyjs / HTML5 pushState“data”参数不保存作为函数的对象的属性

时间:2012-06-25 07:56:38

标签: jquery pushstate history.js

我正在尝试在我的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

我的控制台的输出是一个包含所有原始属性/值的对象,除了具有值函数的所有属性。为什么这些被丢弃/没有被退回?

2 个答案:

答案 0 :(得分:3)

在某一时刻,许多pushState实现使用JSON来序列化和反序列化对象。较新的浏览器版本使用名为the structured clone algorithm的内容。

在这两种情况下,都不支持ErrorFunction个对象,因此您无法将它们用作pushState州的一部分。尝试这样做通常会导致DATA_CLONE_ERR异常,但错误事件可能不会冒泡。

如果你真的想存储一个函数,我看到结构化克隆算法支持Blob克隆,所以你可以将你的函数加载为<script>节点,可能存储这个文本blob作为本地商店的Blob。您必须eval才能使用它(如果使用不当可能会很危险),但即使不完全优雅,我也能看到类似的东西。

答案 1 :(得分:0)

只是想一想为什么不通过json传递函数名,如果它存在于数据中则创建一个新函数然后执行它

temp = new Function(State.data.pre_ajax_callback);
temp();