0

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

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

4

2 回答 2

3

在某一时刻,许多pushState实现使用 JSON 来序列化和反序列化对象。较新的浏览器版本使用称为结构化克隆算法的东西。

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

如果您真的想存储一个函数,我看到结构化克隆算法支持Blob克隆,因此您可以将函数加载为<script>节点,并可能将此文本 blob 存储为Blob本地存储。您必须eval使用它(如果使用不当可能会很危险),但即使不是完全优雅,我也可以看到这样的事情。

于 2012-06-26T00:27:17.203 回答
0

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

temp = new Function(State.data.pre_ajax_callback);
temp();
于 2012-10-09T01:15:20.807 回答