Как сохранить объект с циклическими ссылками?
Я хочу сохранить локально объект, который имеет циклические ссылки. Какие у меня варианты?
Моей первой мыслью было использовать локальное хранилище HTML5, но я не могу строчить этот объект из-за циклических ссылок.
В частности, я пытаюсь сохранить объект DOMSelection текущего выделения.
Пример:
var sel = window.getSelection();
var selstring = JSON.stringify(sel); // Breaks here ...
localStorage.setItem("selection",selstring);
Единственный способ заставить stringify работать сейчас-это игнорировать некоторые объекты, такие как:
var selstring = JSON.stringify(sel,function(k,v){
if( k=="anchorNode" ||
k=="baseNode" ||
k=="extentNode" ||
k=="focusNode") return undefined;
return v;
});
Но это оставляет меня с довольно пустой объект DOMSelection, которого недостаточно для того, что мне нужно.
Есть ли другой способ сохранить этот объект? Единственное требование, чтобы он работал в мобильном safari, все остальное идет действительно. Решение может быть либо в javascript, либо в jquery (или любой другой JS lib, если это необходимо).
Спасибо за любую помощь, которую вы можете оказать.
2 ответа:
ПроверьтеJSON-JS GitHub repo Крокфорда . Он имеет файл
cycle.js
, который предположительно может конвертировать объекты с циклическими ссылками в JSON и обратно с помощью JSONPath. Смотрите последний абзац в репо "read me" и комментарии к файлу.
Ответ здесь заключается в понимании того, какие данные вам действительно нужно хранить постоянно и свести их к минимуму, а затем добавить метод или функцию, чтобы получить только эту информацию,а затем сохранить ее. Я не знаю вашего приложения, но для выделения текста вам, вероятно, просто нужно будет постоянно указывать, какой объект это был, а также начальную и конечную точки выделения текста.
Затем, на стороне восстановления, вы построите функцию для построения выборки использование данных, которые вы храните. Это не так просто сериализовать / десериализовать, но это будет работать.