0

当我将此函数返回的对象发布到 ajax 帖子中时,为什么会出现“ Uncaught TypeError: Illegal invocation ”:

base.serialize = function()
{
var data
  , depth = 0;

    step = function(level, depth)
    {       
        var array  = [ ]
          , items = level.children("li");

            items.each(function()
            {
                var   li   = $(this)
                    , item = $.extend({}, li.data())
                    , sub  = li.children("ol");

                    if (sub.length)
                    {
                        item.children = step(sub, depth + 1);
                    }

                array.push(item);
            });

        return array;
    }

data = step(base.$el, depth);

return data;
};

我要做的是将带有数据值的 HTML 树转换为数组,以将排序顺序保存到数据库:

/*
 * ------------------------------------------------------
 *  Liveflex Treeview
 * ------------------------------------------------------
 */
var tree = $(".dd-list").liveflex_treeview({
      handle        : 'div.dd-handle'
    , opencollapse  : '.opencollapse'
    , itemMoved     : function(e)
                    {
                        var sort_array = e.serialize();

                            // Save order
                            $.post('/url_fetch/sort_posts', { 'sort_array' : sort_array }, function(data)
                            {
                                console.log('Data:' + data);
                            });
                    }
});
4

1 回答 1

2

您正在尝试发布一个包含 DOM 元素的对象。但是 DOM 元素具有循环属性(例如,它们都指向窗口)并且有时包含您无法获取的属性。它们不能被序列化为 JSON(或者任何简单的函数只能递归地序列化属性)。

您的解决方案可能是:

  • 用与您的应用程序相关的某种表示形式替换 DOM 元素
  • 使用特殊函数来序列化 DOM 元素(请参阅此相关问题
于 2013-07-17T08:39:10.303 回答