2010-11-02 4 views
4

По какой-то причине я не могу использовать JSON.stringify для объекта DOMWindow. Например:Stringify Объект DOMWindow

console.log(window.self); // Outputs a hierarchical DOMWindow object 
console.log(JSON.stringify(window.self)); // Outputs nothing - not even an error 

alert(window.self); // Alerts "[object DOMWindow]" 
alert(JSON.stringify(window.self)); // Again nothing - not even an error 

Протестировано на Safari и Chrome. Есть ли у кого-нибудь идеи, как я могу это достичь?

Edit:

Переехал редактировать на новый вопрос, как это на самом деле не специфичны для этого.

+3

См http://stackoverflow.com/questions/2303713/how-to-serialize-dom-node-to-json –

ответ

5

Почему вы хотите сериализовать DOM? Если вам нужно, ссылка Crescent - это то место, где вам нужно посмотреть. Причина, по которой вы не можете сериализовать (стягивать) объект окна, состоит в том, что она содержит циклические ссылки, а JSON.stringify не поддерживает их по умолчанию.

+0

@dosboy обратить внимание на * "почему вы хотите это сделать «*. Вряд ли есть веская причина для сериализации DOM. – cregox

+0

@Alex Прошло много времени, вы, ребята, знаете, как можно было бы отправить объект DOM через модуль IPC? – Kragalon

2

У вас нет ошибки? Я получаю TypeError: Converting circular structure to JSON. Я бы сказал, это невозможно.

Кроме того, window и window.self указывают на тот же объект (Глобальный объект), так что вам не нужно использовать это свойство ...

2

В Chrome 8 разработчика, я получаю TypeError: Converting circular structure to JSON (окно обычно содержит self-referential self, window и top ссылка, если вы не в кадре), поэтому прямо с помощью JSON.stringify не будет работать.

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

var data = JSON.stringify({ 
    'location': window.location 
    // etc 
}); 
3

Как утверждают другие, stringify не поддерживает круговые ссылки, которые содержит DOMWindow. Как правило, круговые ссылки могут быть преобразованы в JSON с использованием Douglas Cockford's JSON cycle.js.

Однако, я просто попробовал это на window, и это все равно вызывает переполнение стека. Хотя это может быть ошибкой в ​​коде cycle.js, кажется более вероятным, что window просто слишком большой для объекта.

0

Этот ответ не мой, но я был здесь для того же самого и нашел этот ответ в другом месте. У меня больше нет этой страницы. У меня есть страница github, которая еще открыта ...

JSON.stringify deep objects - спасибо, @Bergi. https://github.com/Canop/JSON.prune

// JSON.prune : a function to stringify any object without overflow 
// two additional optional parameters : 
// - the maximal depth (default : 6) 
// - the maximal length of arrays (default : 50) 
// You can also pass an "options" object. 
// examples : 

// var json = JSON.prune(window) 
// var arr = Array.apply(0,Array(1000)); var json = JSON.prune(arr, 4, 20) 
// var json = JSON.prune(window.location, {inheritedProperties:true}) 
// Web site : http://dystroy.org/JSON.prune/ 
// JSON.prune on github : https://github.com/Canop/JSON.prune 
// This was discussed here : https://stackoverflow.com/q/13861254/263525 
// The code is based on Douglas Crockford's code : https://github.com/douglascrockford/JSON-js/blob/master/json2.js 
// No effort was done to support old browsers. JSON.prune will fail on IE8. 
(function() { 
    'use strict'; 

    var DEFAULT_MAX_DEPTH = 6; 
    var DEFAULT_ARRAY_MAX_LENGTH = 50; 
    var seen; // Same variable used for all stringifications 
    var iterator; // either forEachEnumerableOwnProperty, forEachEnumerableProperty or forEachProperty 

    // iterates on enumerable own properties (default behavior) 
    var forEachEnumerableOwnProperty = function(obj, callback) { 
     for (var k in obj) { 
      if (Object.prototype.hasOwnProperty.call(obj, k)) callback(k); 
     } 
    }; 
    // iterates on enumerable properties 
    var forEachEnumerableProperty = function(obj, callback) { 
     for (var k in obj) callback(k); 
    }; 
    // iterates on properties, even non enumerable and inherited ones 
    // This is dangerous 
    var forEachProperty = function(obj, callback, excluded) { 
     if (obj==null) return; 
     excluded = excluded || {}; 
     Object.getOwnPropertyNames(obj).forEach(function(k){ 
      if (!excluded[k]) { 
       callback(k); 
       excluded[k] = true; 
      } 
     }); 
     forEachProperty(Object.getPrototypeOf(obj), callback, excluded); 
    }; 

    Date.prototype.toPrunedJSON = Date.prototype.toJSON; 
    String.prototype.toPrunedJSON = String.prototype.toJSON; 

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 
     escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 
     meta = { // table of character substitutions 
      '\b': '\\b', 
      '\t': '\\t', 
      '\n': '\\n', 
      '\f': '\\f', 
      '\r': '\\r', 
      '"' : '\\"', 
      '\\': '\\\\' 
     }; 

    function quote(string) { 
     escapable.lastIndex = 0; 
     return escapable.test(string) ? '"' + string.replace(escapable, function (a) { 
      var c = meta[a]; 
      return typeof c === 'string' 
       ? c 
       : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 
     }) + '"' : '"' + string + '"'; 
    } 

    function str(key, holder, depthDecr, arrayMaxLength) { 
     var i, k, v, length, partial, value = holder[key]; 
     if (value && typeof value === 'object' && typeof value.toPrunedJSON === 'function') { 
      value = value.toPrunedJSON(key); 
     } 

     switch (typeof value) { 
     case 'string': 
      return quote(value); 
     case 'number': 
      return isFinite(value) ? String(value) : 'null'; 
     case 'boolean': 
     case 'null': 
      return String(value); 
     case 'object': 
      if (!value) { 
       return 'null'; 
      } 
      if (depthDecr<=0 || seen.indexOf(value)!==-1) { 
       return '"-pruned-"'; 
      } 
      seen.push(value); 
      partial = []; 
      if (Object.prototype.toString.apply(value) === '[object Array]') { 
       length = Math.min(value.length, arrayMaxLength); 
       for (i = 0; i < length; i += 1) { 
        partial[i] = str(i, value, depthDecr-1, arrayMaxLength) || 'null'; 
       } 
       return '[' + partial.join(',') + ']'; 
      } 
      iterator(value, function(k) { 
       try { 
        v = str(k, value, depthDecr-1, arrayMaxLength); 
        if (v) partial.push(quote(k) + ':' + v); 
       } catch (e) { 
        // this try/catch due to forbidden accessors on some objects 
       }    
      }); 
      return '{' + partial.join(',') + '}'; 
     } 
    } 

    JSON.prune = function (value, depthDecr, arrayMaxLength) { 
     if (typeof depthDecr == "object") { 
      var options = depthDecr; 
      depthDecr = options.depthDecr; 
      arrayMaxLength = options.arrayMaxLength; 
      iterator = options.iterator || forEachEnumerableOwnProperty; 
      if (options.allProperties) iterator = forEachProperty; 
      else if (options.inheritedProperties) iterator = forEachEnumerableProperty 
     } else { 
      iterator = forEachEnumerableOwnProperty; 
     } 
     seen = []; 
     depthDecr = depthDecr || DEFAULT_MAX_DEPTH; 
     arrayMaxLength = arrayMaxLength || DEFAULT_ARRAY_MAX_LENGTH; 
     return str('', {'': value}, depthDecr, arrayMaxLength); 
    }; 

    JSON.prune.log = function() { 
     console.log.apply(console, Array.prototype.slice.call(arguments).map(function(v){return JSON.parse(JSON.prune(v))})); 
    } 
    JSON.prune.forEachProperty = forEachProperty; // you might want to also assign it to Object.forEachProperty 

}()); 
+0

Это, похоже, скопировано из [этого ответа] (http://stackoverflow.com/a/14145840/1048572) – Bergi

+1

@Bergi: сообщение оставило комментарии кода неповрежденными, что, по-видимому, указывает на все соответствующие источники. Кажется, что репо было основано на ответе. – BoltClock

+0

Брэд, скорее всего, ответ Берги связан с тем, откуда вы получили исходный код. – BoltClock

Смежные вопросы