DOM 结构到数组

发布于 2024-11-02 05:02:57 字数 970 浏览 1 评论 0原文

我正在开发“菜单设计器” - 一种在应用程序后端编辑菜单结构的工具。 我有这样的 html 代码

<ul id="menu-designer-control">
    <li id="mi-2">
        <h3>Submenu header</h3>     
        <ul>
            <li id="mi-4"><h4>Hello world - article</h4></li>

            <li><!-- Drop here --></li>
        </ul>
    </li>
    <li id="mi-1">
        <h3>Hello world - article</h3>      
        <ul>
            <li><!-- Drop here --></li>
        </ul>
    </li>

</ul>

我想在 PHP 中得到这样的数组。

array(    
    2 /* top level item id */ => array( 4 /* children id */ ), 
    1 => array() /* or null or whatever */    
);

您能给我一个建议吗?我尝试过 .sortable( 'serialize );,我尝试过使用每个(在所有 li-s 上)。没有成功 - 而且我对 javascript 数组不太熟悉:- / (所以我很不确定它应该是什么样子以及如何将它作为 JSON 对象/字符串发送到服务器?)。

非常感谢

(我正在使用 jQuery。)

I'm working on "menu designer" - a tool to edit menu structure in the app's backend.
I have html code like this

<ul id="menu-designer-control">
    <li id="mi-2">
        <h3>Submenu header</h3>     
        <ul>
            <li id="mi-4"><h4>Hello world - article</h4></li>

            <li><!-- Drop here --></li>
        </ul>
    </li>
    <li id="mi-1">
        <h3>Hello world - article</h3>      
        <ul>
            <li><!-- Drop here --></li>
        </ul>
    </li>

</ul>

And I want to get array like this in PHP.

array(    
    2 /* top level item id */ => array( 4 /* children id */ ), 
    1 => array() /* or null or whatever */    
);

Could you please give me an advice how to do it? I've tried .sortable( 'serialize );, I've tried using each (on all li-s). Nothing with success - furthermore I'm not much familiar with javascript arrays :- / (So I'm pretty unsure how it should look and how to send it to the server… as a JSON object/string?).

Thank you a lot

(I'm using jQuery.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

痴梦一场 2024-11-09 05:02:57
function children(ul) {
  var lis = ul.children(), obj = {};
  lis.each(function(i, li) {
    var id = $(li).attr('id').substr(3);
    if ( id ) {
      obj[id] = children($('> ul', li));
    }
  });
  return obj;
}

var obj = children($('ul#menu-designer-control'));
console.log(obj);

结果将是对象中的对象等。如果仅存在 2 层 LI,则第二层对象将始终为空(没关系)。它的构建是递归的:3 层、4 层等,没问题。

编辑
稍微调整一下: http://jsfiddle.net/rudiedirkx/xhLwF/

编辑< /strong>
Chrome 10 中的结果:

Object
  1: Object (empty)
  2: Object >
    4: Object (empty)

编辑
字符串化 JSON 结果:

{"1": {}, "2": {"4": {}}}
function children(ul) {
  var lis = ul.children(), obj = {};
  lis.each(function(i, li) {
    var id = $(li).attr('id').substr(3);
    if ( id ) {
      obj[id] = children($('> ul', li));
    }
  });
  return obj;
}

var obj = children($('ul#menu-designer-control'));
console.log(obj);

The result would be objects in objects in objects etc. If only 2 lays of LI exist, the second layer objects will always be empty (that's alright). It's build to be recursive though: 3 layers, 4 layers etc, no problem.

edit
Tweaked it a little: http://jsfiddle.net/rudiedirkx/xhLwF/

edit
Result in Chrome 10:

Object
  1: Object (empty)
  2: Object >
    4: Object (empty)

edit
Stringified JSON result:

{"1": {}, "2": {"4": {}}}
糖果控 2024-11-09 05:02:57

您必须使用对象来执行此操作:

var dom = {
   "2":[4]
   ,
   "1":[]
};

我不确定这是否是您问题的答案:)

You must use objects to do this:

var dom = {
   "2":[4]
   ,
   "1":[]
};

I´m not sure if this is the answer to your question :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文