未捕获的TypeError:将循环结构转换为JSON

时间:2014-01-20 12:40:44

标签: javascript jquery json tablednd

我有一个使用JSON.stringify拖放的tableDnD:

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');
                    }
                }
            });             
        }
    });
});

我有以下错误消息:

  

未捕获的TypeError:将循环结构转换为JSON

我只在Chrome上遇到问题。

2 个答案:

答案 0 :(得分:27)

您不应该直接将DOM元素转换为JSON。

虽然 - 就像你已经经历过的那样 - 它失败,例如在Chrome中,结果可能也会出乎意料。

原因是因为数据是循环的:

节点的属性childNode包含其所有子节点,属性parentNode指向父节点。

JSON格式不支持引用,因此它需要遵循属性直到达到目的,但是因为子指向其父级,其中包含子级列表,这是一个无限循环,这就是原因为什么你得到错误:

  

未捕获的TypeError:将循环结构转换为JSON

即使浏览器已解决此问题,您也可能遇到其他问题。 因为不仅存在childNodes,还存在childElements。同样适用于parentNode / parentElement,那么您还有nextSiblingprevSiblingfirstChildlastChild,......也会被跟踪,所以你最终会看到包含重复数据的可怕的大型JSON文件。

答案 1 :(得分:5)

您需要使用DOM元素的.innerHtml属性,而不是转换整个DOM元素。 所以你应该寻找类似的东西:

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