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); }); |
将模块
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,
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"> |
使用
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"> |