我試圖構建多級菜單結構。爲此,我創建了一個使用所有菜單選項製作JSON的遞歸函數。但我在jquery的遞歸函數中遇到了一個匿名問題。我的遞歸函數多次添加元素。提供錯誤結果的jquery遞歸函數
這裏是描述我的問題,我的示例代碼 -
HTML -
<div id="div_menu_items">
<ul id="ul_main_container">
<li menu_id="1">Home
<ul>
<li menu_id="3">Admission
<ul>
<li menu_id="8">About
<ul class="sub_menu_container ui-sortable"></ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
的Jquery/JavaScript的:
var main_menu_list = [];
$(document).ready(function(){
$('#div_menu_items ul#ul_main_container > li').each(function (i, z) {
var menu_id = $(z).attr('menu_id');
main_menu_list.push({"menu_id": menu_id});
checkSubMenu(z, menu_id);
});
console.log(main_menu_list);
alert(JSON.stringify(main_menu_list));
});
function checkSubMenu(obj, parent_menu_id) {
if ($(obj).children('ul').length > 0) {
if ($(obj).children('ul').find('li').length > 0) {
$(obj).children('ul').find('li').each(function (j, el) {
var menu_id = $(el).attr('menu_id');
main_menu_list.push({"menu_id": menu_id});
checkSubMenu(el, menu_id);
});
}
}
}
對於以下JSON [{"menu_id":"1"},{"menu_id":"3"},{"menu_id":"8"},{"menu_id":"8"}]
此示例HTML代碼警報。在這裏你可以看到結果有多個菜單ID 8。但是,這應該只是單一的時間,如[{"menu_id":"1"},{"menu_id":"3"},{"menu_id":"8"}]
。
您還可以檢查的jsfiddle - https://jsfiddle.net/jdtgewxx/1/
我無法理解爲什麼這是發生了什麼? 任何人都可以幫我解決這個問題嗎?
非常感謝您提前... !!!
更新 - 遞歸保存子菜單訂購
其實,我有菜單結構有點複雜程度。我也想保存主菜單下的子菜單。
HTML:
<div id="div_menu_items">
<ul id="ul_main_container">
<li menu_id="1">1st Mainmenu [order 1]
<ul>
<li menu_id="9">1st Submenu [order 1]</li>
<li menu_id="3">2nd Submenu [order 2]
<ul><li menu_id="8">3rd Submenu [order 1]</li></ul>
</li>
</ul>
</li>
<li menu_id="2">2nd Mainmenu [order 2]
<ul>
<li menu_id="4">4th Submenu [order 1]</li>
<li menu_id="5">5th Submenu [order 2]</li>
</ul>
</li>
</ul>
</div>
的Jquery/JavaScript的:
var main_menu_list = [];
$(document).ready(function(){
$('#div_menu_items ul#ul_main_container > li').each(function (i, z) {
var menu_id = $(z).attr('menu_id');
main_menu_list.push({"menu_id": menu_id, "parent_menu_id" : 0, "sorting_order": i + 1});
checkSubMenu(z, menu_id);
});
alert(JSON.stringify(main_menu_list));
});
function checkSubMenu(obj, parent_menu_id) {
if ($(obj).children('ul').length > 0) {
if ($(obj).children('ul').find('li').length > 0) {
$(obj).children('ul').find('li').each(function (j, el) {
var menu_id = $(el).attr('menu_id');
main_menu_list.push({"menu_id": menu_id, "parent_menu_id" : parent_menu_id, "sorting_order": j + 1});
checkSubMenu(el, menu_id);
});
}
}
}
檢查更新小提琴 - https://jsfiddle.net/xqoe9p2m/
這可以在不遞歸來實現。使用遞歸是必要的嗎? –
不,這不是必需的。但有問題,我提供了一個示例HTML層次結構。有很多級別的子菜單,這就是爲什麼我使用遞歸。 –