Как сохранить объект с циклическими ссылками?


Я хочу сохранить локально объект, который имеет циклические ссылки. Какие у меня варианты?

Моей первой мыслью было использовать локальное хранилище 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 7

2 ответа:

ПроверьтеJSON-JS GitHub repo Крокфорда . Он имеет файл cycle.js, который предположительно может конвертировать объекты с циклическими ссылками в JSON и обратно с помощью JSONPath. Смотрите последний абзац в репо "read me" и комментарии к файлу.

Ответ здесь заключается в понимании того, какие данные вам действительно нужно хранить постоянно и свести их к минимуму, а затем добавить метод или функцию, чтобы получить только эту информацию,а затем сохранить ее. Я не знаю вашего приложения, но для выделения текста вам, вероятно, просто нужно будет постоянно указывать, какой объект это был, а также начальную и конечную точки выделения текста.

Затем, на стороне восстановления, вы построите функцию для построения выборки использование данных, которые вы храните. Это не так просто сериализовать / десериализовать, но это будет работать.