Как сохранить объект с круговыми ссылками? - PullRequest
7 голосов
/ 14 сентября 2011

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

Моей первой мыслью было использование локального хранилища 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, которого недостаточно для того, что мне нужно.

Есть ли другой способ сохранить этот объект? Единственное требование состоит в том, что он работает в мобильном сафари, все остальное идет действительно. Решение может быть либо в javascript, либо в jquery (или в любом другом js lib, если это необходимо).

Спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

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

3 голосов
/ 14 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...