2012-06-25 6 views
0

Я пытаюсь использовать PushState в моем веб-приложение, например, так:historyjs/HTML5 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 

выход моей консоли является объектом со всеми своими исходными свойствами/значений, за исключением всех свойств, которые имеют функции для значений. Почему они отбрасываются/не возвращаются?

ответ

3

В какой-то момент многие версии pushState использовали JSON для сериализации и десериализации объектов. В более новых версиях браузера используется то, что называется the structured clone algorithm.

В обоих случаях объекты Error и Function не поддерживаются, поэтому вы не можете использовать их как часть своего состояния pushState. Попытка сделать это обычно приводит к исключению DATA_CLONE_ERR, но, возможно, событие ошибки не пузырится.

Если вы действительно хотите сохранить функцию, я вижу, что алгоритм структурированный клон поддерживает Blob клонированию, так что возможно, вы можете загрузить функцию как <script> узел, с возможностью хранения этого текста сгустка как Blob в местном магазине. Вам понадобится eval, чтобы использовать его (что может быть опасно при неправильном использовании), но я мог видеть что-то подобное, даже если не полностью элегантно.

0

Просто мысли на Почему бы не передать имя функции через JSON, если он существует в данных создать новую функцию, то EXEC его

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