关于javascript:jquery基于JSON数据填充ul和li

jquery to populate ul and li, based on JSON data

下面的代码创建5个ul,并将li填充到所有.dropdown菜单中。
我如何使用JSON数据(或者也许有更好的方法)让jquery填充正确的ul?

预期产量:
并非所有幻灯片都进入所有模块。.仅某些幻灯片应进入JSON数据中所示的特定模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var menulist = {"List" : [
{"menutitle" :"Module 1","mod" :"1"},
{"menutitle" :"Module 2","mod" :"2"},
{"menutitle" :"Module 3","mod" :"3"},
{"menutitle" :"Module 4","mod" :"4"},
{"menutitle" :"Module 5","mod" :"5"}
]}

var slidelist = {"List" : [
{"slidetitle" :"Slide 1","mod" :"1"},
{"slidetitle" :"Slide 2","mod" :"1"},
{"slidetitle" :"Slide 3","mod" :"1"},
{"slidetitle" :"Slide 4","mod" :"1"},
{"slidetitle" :"Slide 5","mod" :"2"},
{"slidetitle" :"Slide 6","mod" :"2"},
{"slidetitle" :"Slide 7","mod" :"3"},
{"slidetitle" :"Slide 8","mod" :"3"},
{"slidetitle" :"Slide 9","mod" :"3"},
{"slidetitle" :"Slide 10","mod" :"4"},
{"slidetitle" :"Slide 11","mod" :"4"},
{"slidetitle" :"Slide 12","mod" :"5"},
{"slidetitle" :"Slide 13","mod" :"5"},
{"slidetitle" :"Slide 14","mod" :"5"},
{"slidetitle" :"Slide 15","mod" :"5"}
]}


$(document).ready(function(){
    var listmenus ="";
    for (var t = 0; t < menulist.List.length; t++){
        listmenus +="" + menulist.List[t].menutitle +"<span class='caret'></span><ul class='dropdown-menu'>
</ul>
"

    }
    $(".test").html(listmenus);
});
$(document).ready(function(){
    var listslides ="";
    for (var s = 0; s < slidelist.List.length; s++){
        listslides +="
<li>
"
+ slidelist.List[s].slidetitle +"
</li>
"

    }
   $(".dropdown-menu").html(listslides);
});


将模块mod添加为DOM对象的属性,可以让您稍后选择它来区分哪些幻灯片在哪里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var menulist = {"List" : [{"menutitle" :"Module 1","mod" :"1"},{"menutitle" :"Module 2","mod" :"2"},{"menutitle" :"Module 3","mod" :"3"},{"menutitle" :"Module 4","mod" :"4"},{"menutitle" :"Module 5","mod" :"5"}]}

var slidelist = {"List" : [{"slidetitle" :"Slide 1","mod" :"1"},{"slidetitle" :"Slide 2","mod" :"1"},{"slidetitle" :"Slide 3","mod" :"1"},{"slidetitle" :"Slide 4","mod" :"1"},{"slidetitle" :"Slide 5","mod" :"2"},{"slidetitle" :"Slide 6","mod" :"2"},{"slidetitle" :"Slide 7","mod" :"3"},{"slidetitle" :"Slide 8","mod" :"3"},{"slidetitle" :"Slide 9","mod" :"3"},{"slidetitle" :"Slide 10","mod" :"4"},{"slidetitle" :"Slide 11","mod" :"4"},{"slidetitle" :"Slide 12","mod" :"5"},{"slidetitle" :"Slide 13","mod" :"5"},{"slidetitle" :"Slide 14","mod" :"5"},{"slidetitle" :"Slide 15","mod" :"5"}]}

$(document).ready(function(){
    var listmenus ="";
    for (var t = 0; t < menulist.List.length; t++){
        listmenus +="" + menulist.List[t].menutitle +"<span class='caret'></span><ul data-value=""+menulist.List[t].mod+"" class='dropdown-menu'>
</ul>
"

    }
    $(".test").html(listmenus);

    for (var s = 0; s < slidelist.List.length; s++){
        $(".dropdown-menu[data-value=" + slidelist.List[s].mod +"]").append("
<li>
"
+ slidelist.List[s].slidetitle +"
</li>
"
);
    }
   
});
1
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">


您似乎想做的很简单。 我认为您正在尝试将子列表分为适当的父母。 只需在与父循环相同的范围内运行循环即可。 然后,您知道什么属于哪里!

使用以下几种jQuery"功能"(例如 $ .each $.('') $ .fn.addClass())的方法如下:

Just FYI, without all the comments and split up items of description, the later code could be as short and simple as the following: and could even by tidied up to be even less!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$(function() {
    $.each(listMenu.List, function(ind, arr) {
        var a = $('', { 'data-toggle': 'dropdown', href: 'javascript:void(0)' }).addClass('dropdown-toggle').text(arr.menutitle),
            span = $('<span />').addClass('caret').appendTo(a),
            ul = $('<ul />');
        $.each(listSlide.List, function(slideInd, slideArr) {
            if (slideArr.mod == arr.mod) {
                var li = $('<li />').appendTo(ul);
                $('', { href: 'javascript:void(0)' }).addClass('link').text(slideArr.slidetitle).appendTo(li);
            }
        });
        $('.test').append(a, ul);
    });
});

举例说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var listMenu = JSON.parse('{"List":[{"menutitle":"Module 1","mod":"1"},{"menutitle":"Module 2","mod":"2"},{"menutitle":"Module 3","mod":"3"},{"menutitle":"Module 4","mod":"4"},{"menutitle":"Module 5","mod":"5"}]}'),
    listSlide = JSON.parse('{"List":[{"slidetitle":"Slide 1","mod":"1"},{"slidetitle":"Slide 2","mod":"1"},{"slidetitle":"Slide 3","mod":"1"},{"slidetitle":"Slide 4","mod":"1"},{"slidetitle":"Slide 5","mod":"2"},{"slidetitle":"Slide 6","mod":"2"},{"slidetitle":"Slide 7","mod":"3"},{"slidetitle":"Slide 8","mod":"3"},{"slidetitle":"Slide 9","mod":"3"},{"slidetitle":"Slide 10","mod":"4"},{"slidetitle":"Slide 11","mod":"4"},{"slidetitle":"Slide 12","mod":"5"},{"slidetitle":"Slide 13","mod":"5"},{"slidetitle":"Slide 14","mod":"5"},{"slidetitle":"Slide 15","mod":"5"}]}');

//  this shorthand expression is same as `$(document).ready(function(){`, FYI, you don't have to write this over and over, once is enough.
$(function() {
    //  filter through the parent list that will make each list
    $.each(listMenu.List, function(ind, arr) {
        //  basics to making an element object in jQuery:
        //  `$("<tagName />", { attributes: value })`
        var a = $('', { 'data-toggle': 'dropdown', href: 'javascript:void(0)' }).text(arr.menutitle),   //  create head link element    //  use of javascript:void(0) tends to be prefered over # unles u have specific purpose for such
            span = $('<span />').appendTo(a),   //  create caret span & insert into our a tag
            ul = $('<ul />') //  create ul element
       
        //  add Classes // only did this here for simplicity of view
        //  Just FYI, this can be done in one line when establish variable above.
        //  Return is always the jQuery Element Object
        a.addClass('dropdown-toggle');
        span.addClass('caret');
       
        //  no need for an extra loop after this one, lets just loop through our sub list here
        //  quick and easy and you can associate better what belongs where without use of extra ID's and such
        $.each(listSlide.List, function(slideInd, slideArr) {
            if (slideArr.mod == arr.mod) {  //  check if item belongs in this list
                var li = $('<li />').appendTo(ul),  //  create li element & insert into our list
                    liA = $('', { href: 'javascript:void(0)' }).addClass('link').text(slideArr.slidetitle).appendTo(li);    //  create and append
            }
        });
       
        $('.test').append(a, ul);
    });
   
    // Just for a little fun and further education, let's add some functionality!
    //  Here, I'll assign"events" to slide the list up and down,
    //  but the elements are added"dynamically", so I'll instead assign the events to
    //  a"static parent" (in this case the DOM) and associate what elements
    //  the event belongs to with my 2nd parameter.
    //  Read more about this here: http://api.jquery.com/on/
    $(document)
        .on('click', '.dropdown-toggle', function(e) {
            //  this is the HTML element,
            //  wrapping it in $() gives us jQuery object methods!
            //  Read about the .next method here: http://api.jquery.com/next/
            //  I use $.stop to stop and complete any animation in progress (multiclicking issues)
            //  Read about .stop here: http://api.jquery.com/stop/
            //  I use slideToggle to make the menu go up and down!
            //  Read about .slideToggle here: http://api.jquery.com/slideToggle/
            $(this).next('ul').stop(true, true).slideToggle();
        })  //  finally, notice i did not close this `);`
            //  This is because I wanted to show you, you can use jQuery"chaining"
            //  to continue. So, if you wanted to add more events for other elements,
            //  you would just put a `.on(` and keep going, like so:
            //
            //    $(document)
            //      .on('event', 'selector', function(e) {})
            //      .on('event', 'selector', function(e) {})
            //      .on('event', 'selector', function(e) {})
            //      .on('event', 'selector', function(e) {})
            //      .on('event', 'selector', function(e) {})
});
1
.test > a { display: block; }
1
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">


我的建议基于直接在jQuery中创建新元素,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
var dp = $('', {class: 'dropdown'})
      .append($('<button/>', {
          class: 'btn btn-default dropdown-toggle',
          type: 'button',
          id: 'dropdownMenu' + index,
          'data-toggle': 'dropdown',
          'aria-haspopup': true,
          'aria-expanded': true
      }).append(ele.menutitle).append($('<span/>', {class: 'caret'})))
      .append($('<ul/>', {
          class: 'dropdown-menu',
          'aria-labelledby': 'dropdownMenu' + index
      }));

片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var menulist = {
 "List": [
    {"menutitle":"Module 1","mod":"1"},
    {"menutitle":"Module 2","mod":"2"},
    {"menutitle":"Module 3","mod":"3"},
    {"menutitle":"Module 4","mod":"4"},
    {"menutitle":"Module 5","mod":"5"}
  ]
}

var slidelist = {
 "List": [
    {"slidetitle":"Slide 1","mod":"1"},
    {"slidetitle":"Slide 2","mod":"1"},
    {"slidetitle":"Slide 3","mod":"1"},
    {"slidetitle":"Slide 4","mod":"1"},
    {"slidetitle":"Slide 5","mod":"2"},
    {"slidetitle":"Slide 6","mod":"2"},
    {"slidetitle":"Slide 7","mod":"3"},
    {"slidetitle":"Slide 8","mod":"3"},
    {"slidetitle":"Slide 9","mod":"3"},
    {"slidetitle":"Slide 10","mod":"4"},
    {"slidetitle":"Slide 11","mod":"4"},
    {"slidetitle":"Slide 12","mod":"5"},
    {"slidetitle":"Slide 13","mod":"5"},
    {"slidetitle":"Slide 14","mod":"5"},
    {"slidetitle":"Slide 15","mod":"5"}
  ]
}


menulist.List.forEach(function (ele, index) {
  //
  // Create the main dropdown element
  //
  var dp = $('', {class: 'dropdown'})
  .append($('<button/>', {
    class: 'btn btn-default dropdown-toggle',
    type: 'button',
    id: 'dropdownMenu' + index,
    'data-toggle': 'dropdown'
  }).append(ele.menutitle + ' ').append($('<span/>', {class: 'caret'})))
  .append($('<ul/>', {
    class: 'dropdown-menu',
    'aria-labelledby': 'dropdownMenu' + index
  }));
  var cachedInsertPoint = dp.find('ul');
  slidelist.List.filter( (e, i) => { return e.mod == ele.mod }).forEach(function(e, idx) {
    //
    // for each corresponding element in the second array
    // add the relative option
    //
    cachedInsertPoint.append($('<li/>').append($('', {
      href: '#',
      text: e.slidetitle
    })));
  });
  $('body').append(dp);
});
1
2
3
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-2.1.1.min.js">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js">


使用data-*属性,该属性保存每个ul上的mod值,然后根据该值获取ul。 您可以使用一个对象来保存生成的HTML字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
var menulist = {
 "List": [{
   "menutitle":"Module 1",
   "mod":"1"
  }, {
   "menutitle":"Module 2",
   "mod":"2"
  }, {
   "menutitle":"Module 3",
   "mod":"3"
  }, {
   "menutitle":"Module 4",
   "mod":"4"
  }, {
   "menutitle":"Module 5",
   "mod":"5"
  }]
}

var slidelist = {
 "List": [{
   "slidetitle":"Slide 1",
   "mod":"1"
  }, {
   "slidetitle":"Slide 2",
   "mod":"1"
  }, {
   "slidetitle":"Slide 3",
   "mod":"1"
  }, {
   "slidetitle":"Slide 4",
   "mod":"1"
  }, {
   "slidetitle":"Slide 5",
   "mod":"2"
  }, {
   "slidetitle":"Slide 6",
   "mod":"2"
  }, {
   "slidetitle":"Slide 7",
   "mod":"3"
  }, {
   "slidetitle":"Slide 8",
   "mod":"3"
  }, {
   "slidetitle":"Slide 9",
   "mod":"3"
  }, {
   "slidetitle":"Slide 10",
   "mod":"4"
  }, {
   "slidetitle":"Slide 11",
   "mod":"4"
  }, {
   "slidetitle":"Slide 12",
   "mod":"5"
  }, {
   "slidetitle":"Slide 13",
   "mod":"5"
  }, {
   "slidetitle":"Slide 14",
   "mod":"5"
  }, {
   "slidetitle":"Slide 15",
   "mod":"5"
  }]
}


$(document).ready(function() {
  var listmenus ="";
  for (var t = 0; t < menulist.List.length; t++) {
    listmenus +="" + menulist.List[t].menutitle +"<span class='caret'></span><ul data-mod='" + menulist.List[t].mod +"' class='dropdown-menu'>
</ul>
"

  }
  $(".test").html(listmenus);

  var listslides = {};
  for (var s = 0; s < slidelist.List.length; s++) {
    listslides[slidelist.List[s].mod] = listslides[slidelist.List[s].mod] || '';
    listslides[slidelist.List[s].mod] +="
<li>
"
+ slidelist.List[s].slidetitle +"
</li>
"

  }

  Object.keys(listslides).forEach(function(l) {
    $('.dropdown-menu[data-mod="' + l + '"]').html($('<ul/>', {
      id: l,
      html: listslides[l]
    }))
  })
});
1
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">