2016-05-12 17 views
1

Ich versuche, Informationen zu einem JSON für die Speicherung zu konvertieren klicken Sie mitConvert klicken Info zu JSON

$(document).click(function(e){ 
    url = '/recordclick'; 
    $.post(url, {'clickData':JSON.stringify(e)}); 
}); 

aber es scheint, dass das Click-Ereignis ein oder mehrere zirkuläre Referenzen darin, weil ich den Fehler

Gibt es eine Möglichkeit, das click -Ereignis ohne Zirkelverweise in etwas umzuwandeln, ohne die kreisförmig referenzierenden Eigenschaften manuell zu entfernen?

+0

Tun Sie das nicht. Welchen Teil der Veranstaltung brauchen Sie eigentlich? – SLaks

+0

Warum müssen Sie solch ein großes Event-Objekt in JSON stringieren? – MarkoCen

+0

warum nicht einfach ein Objekt mit nur den Sachen, die Sie brauchen, und dann tun Sie die JSON.stringify –

Antwort

2

Sie verwenden können Douglas Crockford ‚s JSON.decycle Funktion eine tiefe Kopie des Ereignisobjekts zu machen, bevor es zu JSON kodiert.

Souce-Code hier: https://github.com/douglascrockford/JSON-js/blob/master/cycle.js

Hier ist ein Zitat aus dem Quellcode der Beschreibung der Funktion

Make a deep copy of an object or array, assuring that there is at most one instance of each object or array in the resulting structure. The duplicate references (which might be forming cycles) are replaced with an object of the form {"$ref": PATH} where the PATH is a JSONPath string that locates the first occurance. [...]

Wie Sie JSON.decycle Code enthalten haben kann wie folgt angepasst werden:

$(document).click(function(e) { 
    var url = '/recordclick', // let's declare variables as local! 
     dec = JSON.decycle(e); 
    $.post(url, { 'clickData': JSON.stringify(dec) }); 
}); 
1

Die Stringify-Funktion akzeptiert eine Filterfunktion als zweiten Parameter, also denke ich, dass Sie das tun können.

JSON.stringify(event, function(key, value) { 
    if(key == 'circularReference1' || key == 'circularReference2') { return value.id;} 
    else {return value;} 
} 
+0

Das setzt voraus, dass ich eine Liste ('circularReference1', 'circularReference2' usw.) von Zirkelverweisen habe, richtig? – wogsland

+0

Genau, Sie können die Liste leicht durch Überprüfen des Ereignisobjekts, meist sind DOM-Elemente, die im Ereignis wie Eltern usw. referenziert wird ... –