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 に答える