Как сохранить объект с круговыми ссылками?

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

Моей первой мыслью было использование локального хранилища HTML5, но я не могу структурировать этот объект из-за циклических ссылок.

В частности, я пытаюсь сохранить объект DOMSelection текущего выделения.

Пример:

  var sel = window.getSelection();
  var selstring = JSON.stringify(sel); // Breaks here ...
  localStorage.setItem("selection",selstring);

Единственный способ заставить строку работать сейчас - это игнорировать определенные объекты следующим образом:

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, если это необходимо).

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

7 голосов | спросил nebs 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 21:40:15 +0400 2011, 21:40:15

2 ответа


0

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

ответил Alex Turpin 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 21:48:31 +0400 2011, 21:48:31
0

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

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

ответил jfriend00 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 21:48:20 +0400 2011, 21:48:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132