为什么我会得到"非法援引"这个对象?

时间:2013-07-17 08:28:45

标签: ajax arrays jquery-ui jquery

当我将此函数返回的对象发布到ajax帖子中时,为什么会出现“未捕获的TypeError:非法调用”:

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

1 个答案:

答案 0 :(得分:1)

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

您的解决方案可能是:

  • 用某种与您的应用程序相关的表示替换DOM元素
  • 使用特殊函数序列化DOM元素(请参阅this related question