2014-01-20 5 views
21

Ich habe einen tableDnD Drag & Drop mit JSON.stringify:Uncaught Typeerror: Konvertieren Kreisstruktur zu JSON

jQuery(document).ready(function() { 
    jQuery("#Table").tableDnD({ 
     onDragClass: "danger", 
     onDrop: function(table, row) { 
      jQuery.ajax({ 
       url: "ajax.php", 
       type: "post", 
       data: { 
        'rows' : JSON.stringify(table.tBodies[0].rows) 
       }, 
       dataType: 'html', 
       success: function(reponse) { 
        if(reponse) { 
         //alert('Success'); 
        } else { 
         alert('Erreur'); 
        } 
       } 
      });    
     } 
    }); 
}); 

Ich habe diese Fehlermeldung:

Uncaught TypeError: Converting circular structure to JSON

Ich habe das Problem nur auf Chrome .

+0

Sie versuchen, eine nodeList/DOM-Elemente in eine JSON-Zeichenfolge zu konvertieren – adeneo

+0

ja, es auf Firefox funktioniert, aber es gibt Probleme in Chrome – jawad

+0

Wenn es funktioniert Es ist ein Zufall, dass man Knotenlisten nicht in Strings konvertieren kann, oder zumindest nicht. – adeneo

Antwort

23

Sie sollten ein DOM-Element nicht direkt in JSON konvertieren.

Während - wie Sie schon erlebt haben - es scheitert z. In Chrome können die Ergebnisse auch unerwartet sein.

Der Grund dafür ist, dass die Daten kreisförmig ist:

Ein Knoten hat die Eigenschaft childNode alle seine Kinder und die Eigenschaft parentNode zeigt auf die übergeordnete enthält.

Das JSON-Format unterstützt keine Verweise, daher muss es den Eigenschaften folgen, bis ein Ende erreicht ist, aber da ein Kind auf seinen Elternknoten zeigt, der eine Liste seiner untergeordneten Elemente enthält, handelt es sich um eine Endlosschleife Grund, warum Sie den Fehler erhalten:

Auch wenn dies vom Browser gelöst wird, haben Sie möglicherweise andere Probleme. Da nicht nur childNodes existieren, sondern auch childElements. Das selbe ist für parentNode/parentElement, dann haben Sie auch nextSibling, , firstChild, lastChild, ... das würde vermutlich auch gefolgt, also würden Sie in der erschreckenden großen json Akte enden, die eine Hinterpfeife der doppelten Daten enthält.

+2

Ich bin heute darauf gestoßen, danke für die Erklärung. – delliottg

5

Sie müssen die .innerHtml-Eigenschaft des DOM-Elements verwenden, anstatt das gesamte DOM-Element zu konvertieren. Sie sollten also so etwas wie haben, suchen:

JSON.stringify(table.tBodies[0].innerHTML) 
Verwandte Themen