【问题标题】:Converting entire window object to string将整个窗口对象转换为字符串
【发布时间】:2016-06-08 08:30:43
【问题描述】:

我需要检查整个窗口对象,以检查数据实际保存的位置。

如果我执行window.toString() 我得到"[object Window]" 我也尝试了JSON.stringify(window) 函数并得到以下错误:

VM18766:1 Uncaught TypeError: Converting circular structure to JSON

有什么方法可以获取包括原型函数在内的整个 javascript 对象内容?

我需要这个以便我可以在对象文本中搜索保存在对象中的特定内容以及该对象的位置。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    如果你尝试做JSON.stringify(window),你会得到如下错误:

    Uncaught TypeError: Converting circular structure to JSON
    

    从此this StackOverflow 帖子中,您可以执行以下操作:

    const p = document.getElementById('p');
    
    const getCircularReplacer = () => {
        const seen = new WeakSet();
        return (key, value) => {
            if (typeof value === "object" && value !== null) {
                if (seen.has(value)) {
                    return;
                }
                seen.add(value);
            }
            return value;
        };
    };
    
    p.innerHTML = JSON.stringify(window, getCircularReplacer());
    <html>
    <head>
    </head>
    <body>
    <p id="p"></p>
    <script src="app.js"></script>
    </body>
    </html>

    【讨论】:

      【解决方案2】:

      DOM 不可能在 JSON 中序列化,因为正如错误所说,它包含循环引用。一个简单的例子是每个元素都有一个.children 数组,每个子元素都有一个.parent 值。这对我来说似乎是XY problem。看看this question,这可能有助于您实际尝试做的事情。

      【讨论】:

      • 我不想将其转换为 json。我只想查看所有对象以查看我的数据在哪里
      • 我有一个用 knockoutJS 构建的网站。我想获取包含内容的数据对象
      • @AryehArmon,您能否提供您要提取的确切内容的详细信息,我们可以从那里开始。
      【解决方案3】:

      您可以使用像this 这样的第三方库,看看它是否输出了您想要的内容。用法:

      <script src="circular-json.js"></script>
      

      并且(例如在您的 onload 函数中)

      var CircularJSON = window.CircularJSON;
      var obj = window;
      var str;
      
      obj.self = obj;
      console.log(CircularJSON.stringify(obj));
      

      你也可以使用

      console.log(window);
      

      检查对象并在浏览器控制台中搜索对象。

      【讨论】:

      • 我收到一个错误:VM10998:2 Uncaught DOMException: Blocked a frame with origin "" from access a cross-origin frame.(...)
      • 跟踪我需要查看您的整个页面。但似乎您在某处有 iFrame,并且对 iFrame 的访问被阻止(请参阅this answer
      • 有没有办法在整个窗口对象中搜索特定属性
      【解决方案4】:

      这是不可能的,因为窗口对象是一个圆形对象

      例如请求中传递的对象有一个循环引用,类似于:

      var a = {};
      a.b = a;
      

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 2014-01-14
        • 2011-08-02
        • 2016-06-10
        相关资源
        最近更新 更多