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 に答える