25

我有一个带有 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 上才有这个问题。

4

2 回答 2

28

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

虽然 - 就像您已经体验过的那样 - 它在 Chrome 中失败了,但结果也可能出乎意料。

这样做的原因是因为数据是循环的:

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

JSON格式不支持引用,因此它需要遵循属性直到到达终点,但是因为一个孩子指向它的父母,它有一个孩子的列表,这是一个无限循环,这就是你得到的原因错误:

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

即使浏览器解决了这个问题,您也可能遇到其他问题。因为不仅childNodes存在而且childElementsparentNode/也是如此parentElement,那么你也有nextSibling, prevSibling, firstChild, lastChild, ... 这可能也会被遵循,所以你最终会得到一个包含大量重复数据的可怕的大型 JSON 文件。

于 2014-01-20T13:00:07.413 回答
5

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

JSON.stringify(table.tBodies[0].innerHTML)
于 2014-11-01T09:10:41.477 回答