相关疑难解决方法(0)

JSON.stringify深层对象

我需要一个函数从任何参数构建一个JSON有效字符串,但是:

  • 通过两次不添加对象来避免递归问题
  • 通过截断超过给定深度来避免调用堆栈大小问题

通常它应该能够以截断它们为代价来处理大对象.

作为参考,此代码失败:

var json = JSON.stringify(window);
Run Code Online (Sandbox Code Playgroud)

避免递归问题很简单:

var seen = [];
return JSON.stringify(o, function(_, value) {
    if (typeof value === 'object' && value !== null) {
        if (seen.indexOf(value) !== -1) return;
        else seen.push(value);
    }
    return value;
});
Run Code Online (Sandbox Code Playgroud)

但现在,除了复制并更改道格拉斯Crockford的代码追踪深度的,我没有发现任何方式,以避免像很深刻的对象堆栈溢出window或任何event.有简单的解决方案吗?

javascript json stringify

50
推荐指数
4
解决办法
4万
查看次数

如果有循环引用,如何将DOM节点序列化为JSON?

我想将DOM节点甚至整个序列化为windowJSON.

例如:

 >> serialize(document)
    -> {
      "URL": "http://stackoverflow.com/posts/2303713",
      "body": {
        "aLink": "",
        "attributes": [
          "getNamedItem": "function getNamedItem() { [native code] }",
          ...
        ],
        ...
        "ownerDocument": "#" // recursive link here
      },
      ...
    }
Run Code Online (Sandbox Code Playgroud)

JSON.stringify()

JSON.stringify(window) // TypeError: Converting circular structure to JSON
Run Code Online (Sandbox Code Playgroud)

问题是JSON默认不支持循环引用.

var obj = {}
obj.me = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON
Run Code Online (Sandbox Code Playgroud)

window和DOM节点有很多.window === window.window将如此document.body.ownerDocument === document.

此外,JSON.stringify不序列化函数,所以这不是我想要的.

dojox.json.ref

 `dojox.json.ref.toJson()` can easily serialize object with …
Run Code Online (Sandbox Code Playgroud)

javascript serialization json dom circular-reference

48
推荐指数
3
解决办法
6万
查看次数

刷新后检索子窗口引用

我有一个HTML5离线应用程序(即没有服务器端组件/代码).

它基本上有两个窗口(父和子).但是,在某些情况下,我需要以编程方式刷新父窗口.发生这种情况时,它会丢失对子节点的引用,并且子节点对window.opener的引用不再有效.所以我的想法是我将序列化子窗口并将其存储在localStorage中.然后当父进行刷新时,它可以从localStorage中获取窗口引用并仍然与子进程交互.

问题是这不起作用(根据我之前的问题Stringify DOMWindow对象).我无法像任何其他对象一样序列化DOM窗口.

那么我怎样才能让我新刷新的窗口获取对其前任孩子的引用?

编辑:强调它是一个离线应用程序的事实.没有服务器端组件.

我还要补充一点,我需要刷新父级的原因是检查应用程序更新(缓存清单中的更改).由于父是加载的应用程序中的第一个页面,它基本上管理缓存(事实上,在Safari中,如果在任何缓存过程中关闭此窗口,则整个浏览器崩溃).所以"父"本质上是"用户加载的第一页". 这意味着我不能在框架中拥有"父",因为最顶层的窗口将管理缓存,并且需要刷新才能查找更新.实际上,似乎我可以使用frame方法,因为刷新应用程序中的任何页面都会触发更新检查.虽然很麻烦.

javascript html5 dom

8
推荐指数
2
解决办法
6897
查看次数

为什么JSON.stringify()为某些对象返回空结果

这个问题是如此基本,但我不知道答案.

为什么screenstringified返回为空时对象?

这是否意味着JSON.stringify()需要对输入进行读/写访问?

let a = {foo: 'one', bar: 2};


console.log(JSON.stringify(a));
console.log(JSON.stringify(screen));
Run Code Online (Sandbox Code Playgroud)

javascript

5
推荐指数
1
解决办法
372
查看次数