let exConfig let containExamples = false, thumbLocation = getThumbLocation() $(document).ready(function () { bindEvents() //懒加载 setTimeout(function () { $("img.chart-thumb").lazyload() }, 1000) $.ajax({ type: "get", dataType: "json", url: "config/example.json", //配置文件目录 success: function (result) { exConfig = exampleData(result) haoutil.storage.add("example-config", JSON.stringify(exConfig)) initPage() }, error: function (error) { console.log("加载JSON出错", error) haoutil.alert(error?.message, "出错了") } }) }) //处理示例配置数据 function exampleData(arr) { arr.forEach((item1, index1) => { let count = 0 item1.id = "ex_" + index1 if (item1.children) { item1.children.forEach((item2, index2) => { item2.count = item2.children ? item2.children.length : 0 //统计个数 count += item2.count item2.id = item1.id + "_" + index2 if (item2.children) { item2.children.forEach((item3, index3) => { if (item3.hidden) { count-- item2.count-- } item3.id = item3.id + "_" + index3 item3.fullName = `${item1.name} - ${item2.name} - ${item3.name}` }) } }) } item1.count = count //统计个数 }) // haoutil.file.downloadFile("example.json", JSON.stringify(arr)) return arr } //侧边栏滚动支持 function sidebarScrollFix() { $("ul#sidebar-menu>li").hover( function (evt) { if (!$("body").hasClass("sidebar-collapse")) { return } //调整一级菜单li下标题的布局位置至右侧 let $titleBar = $(this).children("a").children(".sidebar-title-bar") $titleBar.css({ top: $(this).offset().top - $(window).scrollTop() + "px", //fix由于侧边栏滚动条宽度引起的减少的宽度 width: "233px" }) //如果底部空间不够,动态增加侧边栏高度 let visibleOffsetTop = $(this).offset().top - $(window).scrollTop() let offsetBottom = $(".sidebar-menu").height() - visibleOffsetTop let requireVisibleHeight = $(this).height() + $(this).children("ul").height() if (offsetBottom <= requireVisibleHeight) { $(".sidebar-menu").css({ height: requireVisibleHeight + $(window).height() + "px" }) } //调整一级菜单li下子列表的布局位置至右侧 let offsetTop = visibleOffsetTop + $(this).height() $(this) .children("ul") .css({ top: offsetTop + "px" }) //fix小尺寸屏幕下二级菜单高度高于窗口高度时显示不全的情况 let $activeList = $(this).children("ul") let activeListOffsetBottom = Math.abs($(window).height() - visibleOffsetTop - $(this).height()) let requireActiveListHeight = $activeList.height() if (activeListOffsetBottom < requireActiveListHeight) { $activeList.css({ height: requireActiveListHeight }) //滚动条样式 $activeList.addClass("scroll-list") } }, function (evt) { if (!$("body").hasClass("sidebar-collapse")) { return } //滚动条 $(this).children("ul").removeClass("scroll-list") //恢复原来的高度 $(this).children("ul").css({ height: "auto" }) } ) $(".main-sidebar").on("scroll", function (evt) { evt.stopPropagation() }) $(window).on("resize", function () { $(".sidebar-menu").css({ height: "100%" }) }) } //创建菜单项 function createSideBarMenuItem(config, containAll) { if (!config) { return } containExamples = containAll let li = $("
") if (config.children) { createSideBarMenuTitle(config, true).appendTo(li) createSideBarSecondMenu(config.children).appendTo(li) } else { createSideBarMenuTitle(config, false).appendTo(li) } return li } //创建二级菜单 function createSideBarSecondMenu(children) { let ul = $("") children.forEach((item, index) => { let li = $("") li.appendTo(ul) if (containExamples && item.children) { createSideBarMenuSecondTitle(item, true).appendTo(li) createSideBarThirdMenu(item.children).appendTo(li) } else { createSideBarMenuSecondTitle(item, false).appendTo(li) } }) return ul } function fileName2Id(file) { let value = (file || "").replace(".html", "") return value } function id2FileName(id) { return id + ".html" } //创建三级菜单 function createSideBarThirdMenu(examples) { let ul = $("") let len = examples && examples.length ? examples.length : 0 for (let i = 0; i < len; i++) { let example = examples[i] let _id = fileName2Id(example.main) let li = $("") li.appendTo(ul) if (_id != "" && example.name) { createSideBarMenuThirdTitle(_id, example, false).appendTo(li) } } return ul } function createSideBarMenuTitle(config, collapse) { let id = config.id || "" let icon = "", iconName = config.icon if (iconName) { icon = "" } let href = "" if (location.href.indexOf(window.editorUrl) != -1) { href = "../index.html#" + id } else { href = "#" + id } let div = $("" + icon + "" + config.name + "(" + config.count + ")") if (collapse) { div.append(createCollapsedIcon()) } return div } function createSideBarMenuSecondTitle(item, collapse) { let id = item.id || "" let icon = "", iconName = item.icon if (iconName) { icon = "" } let href = "" if (location.href.indexOf(window.editorUrl) != -1) { href = "../index.html#" + id } else { href = "#" + id } let div = $( "" + icon + "" + item.name + "(" + item.count + ")" ) if (collapse) { div.append(createCollapsedIcon()) } return div } function createSideBarMenuThirdTitle(id, item, collapse) { id = id || "" let icon = "", iconName = item.icon if (iconName) { icon = "" } let div = $("" + icon + "" + item.name + "") if (collapse) { div.append(createCollapsedIcon()) } return div } //创建右侧折叠菜单 function createCollapsedIcon() { return $(" ") } //只处理三层节点,后续可优化 function selectMenu(id, length) { let target = _getTarget(id, length) if (length !== 1) { //控制editor页面左侧导航栏一级菜单高亮 _selectTarget(target.parent().parent().parent().parent()) //控制示例页面左侧导航栏一级菜单高亮 _selectTarget(target.parent().parent()) //控制左侧导航栏最低级菜单高亮 _selectTarget(target.parent()) _selectTarget(target.find("ul")) } } function _getTarget(id, length) { let target if (length) { if (length === 1) { $("section#sidebar li.active").removeClass("active") target = $("section#sidebar li#bar_" + id) target.children("ul").show() } if (length === 2) { $("section#sidebar li.active ul.active li").removeClass("active") target = $("section#sidebar li.treeview") .children("ul") .children("li#bar_" + id) } } else { $("section#sidebar #ul").addClass("active") $("section#sidebar li.active").removeClass("active") target = $("section#sidebar li#bar_" + id) } target && target.addClass("active") return target } function _selectTarget(target) { if (!target || target.length < 1) { return } let className = target.attr("class") if (className && className.indexOf("treeview-menu") > -1 && className.indexOf("menu-open") === -1) { target.addClass("menu-open") target.css("display", "block") } if (className && className.indexOf("treeview") > -1) { target.addClass("active") } } //左侧层级不包含例子,只包含分类 function initPage() { let sideBar = $("ul#sidebar-menu") let chartList = $("#charts-list") exConfig.forEach((item, index1) => { let count = 0 if (item.children) { item.children.forEach((configItem, index) => { configItem.count = configItem.children ? configItem.children.length : 0 count += configItem.count }) } item.count = count sideBar.append(createSideBarMenuItem(item, containExamples)) chartList.append(createGalleryItem(item)) }) resizeCharts() initSelect() sidebarScrollFix() } //初始化页面第一次加载 function initSelect() { let hash = window.location.hash if (hash.indexOf("#") === -1) { // var id = $('#sidebar li').first().children('a')[0].hash; // window.location.hash = (id) ? id : window.location.hash; } else { scroll() } } //初始化示例面板 function createGalleryItem(item) { if (!item) { return } let categoryLi = $("") if (item.name) { createGalleryItemTitle(item).appendTo(categoryLi) } if (item.children) { createSubGalleryItem(item.children).appendTo(categoryLi) } return categoryLi } function createSubGalleryItem(config) { let categoryContentDiv = $("") config.forEach((configItem, index) => { let content = $("") createSubGalleryItemTitle(configItem).appendTo(content) if (configItem.children) { createGalleryCharts(configItem.children).appendTo(content) } content.appendTo(categoryContentDiv) }) return categoryContentDiv } function createGalleryItemTitle(item) { return $( "