热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BootStrap实现树形目录组件代码详解

这篇文章主要介绍了BootStrap实现树形目录组件代码详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

需求描述

产品添加页面,需要选择车型。在bootStrap的modal上弹出子modal来使用。

车型一共有4级目录。要使用目录树。

然后分活动和商品两种,需要能够通过不通参数来调用该组件。

车型品牌要使用字母导航。

技术实现

数据都是后端传json过来,我们ajax获取然后操作。

由于车型总数据有几万条以上,不可能一次性请求过来。这里我们使用异步的方式,每点击一次目录节点,加载它的下一级。

这里我们用两个参数来控制活动和商品的不同加载。_showPrice和opened

后端传过来的第一级数据是车型品牌,其中有首字母的字段。字母导航的初始化,就是把这个数据用firstWord属性来排序,然后忽略掉其他首字母相同的元素。

对于活动类型,需要返回所勾选的最低一级的数据。(勾选奥迪和奥迪A6,则只返回A6的意思),这里用了整整4层循环。不过它是根据是否有checked来遍历的,速度不慢。

 /**
 * Created by nuenfeng on 2016/5/23.
 * 车型选择组件
 * 参数:
 * showPrice 是否要输入价格(不输入价格的从品牌开始就有选项框,没有全选功能)
 * params 外部传入的对象
 * callback 回调函数
 */
 (function () {
 var uriCarBrand = global.url.carBrandList;
 //var uri = uriCarBrand.url;
 var opened = false; //当前页面是否打开过本组件
 var _callback; //回调函数
 var requestParams; //请求时要使用的参数
 var _showPrice; //是否要输入价格
 var lastShowPrice; //前一次打开状态
 var charNavArr; //字母导航数组
 function CarTree(showPrice, params, callback) {
 // 没打开过,初始化; 打开过,直接显示modal
 requestParams = params;
 _showPrice = showPrice;
 _callback = callback;
 if (!opened || lastShowPrice != showPrice) {
 this.init();
 opened = true;
 lastShowPrice = showPrice;
 } else {
 $('#zc-sub-modal').modal('show');
 }
 }
 CarTree.prototype.init = function () { 
 msjcTools.addSubModal();
 //设置大模态框
 $('#zc-sub-modal').addClass("bs-example-modal-lg");
 $('#zc-sub-modal .modal-dialog').addClass("modal-lg");
 var str = '';
 str += '
    ' str += '
  • 汽车品牌选择'; str += "
  • " str += '
' str += ''; var objId = 'cb_0'; var carBrandId = 0; loadSubMenu(objId, carBrandId, 1); //1 表示第一次加载,用于加载成功后判断时候要初始化字母导航 $('#zc-sub-modal-body').html(str); $('#zc-sub-modal').modal({ keyboard: false, show: true }); // 点击保存事件 $('#zc-sub-modal .modal-footer .btn.btn-primary').unbind().bind("click", function () { save(); }); //$("#resourceId").find("input[type=checkbox]").unbind().bind("click",function(){ // if($(this).is(':checked')==true){//选中 则其上层节点全部展开并选中 // //上级选中 // $(this).parents("li").each(function(){ // $(this).find("input[type=checkbox]:first").attr("checked",true) // }); // } else { // //下级取消选中 // $(this).siblings("ul").find("input[type=checkbox]").each(function(){ // $(this).removeAttr("checked"); // }); // } //}); //隐藏子窗口后 保持父窗口的滚动 $("#zc-sub-modal").on("hidden.bs.modal", function () { $('body').addClass('modal-open') }); } CarTree.prototype.empty = function () { opened = false; console.log('empty me'); } //加载子菜单 var loadSubMenu = function (objId, carBrandId, times) { requestParams.brandId = carBrandId; executeAjax(global.url.carBrandList, requestParams, function (data) { // 给data风骚地排个序 data.sort(keysrt("firstWord")); var menuHtml = "
    "; for (var index in data) { var menu = data[index]; menuHtml += '"; } menuHtml += "
"; $('#' + objId).append(menuHtml); $('#' + objId).attr('data-load', 'loaded'); //汽车类型第一级加载完成后,初始化字符导航 charNavArr = []; var fwdLast = ''; //上一次的首字母 for (var i in data) { var cobjTemp = {}; if (fwdLast != data[i].firstWord) { fwdLast = data[i].firstWord; cobjTemp.firstWord = fwdLast; cobjTemp.targetId = 'cb_'+data[i].carBrandId; charNavArr.push(cobjTemp); } } if (times == 1) { initCharNav(); // 点击保存事件 $('.charNavSaveBtn').unbind().bind("click", function () { save(); }); } }); } // 此处是风骚的数组对象排序 var keysrt = function (propertyName) { return function (object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value2 value1) { return -; } else { return ; } } } // 保存事件 var save = function(){ // 确认后,执行回调函数 if (_showPrice) { var res = getPriceResult(); if (res.status) { _callback(res.data); } else { alert(res.error); return; } } else { _callback(getNopriceResult()); } //返回数据,然后隐藏 $('#zc-sub-modal').modal('hide'); } // 设置字符导航初始化 var initCharNav = function () { var charNavHtml = ''; $('#zc-sub-modal').append(charNavHtml); $('.modalGoTop').on('click', function(e){ $('#zc-sub-modal').animate({scrollTop: }, ); }); } // 统计带价格的返回数据 var getPriceResult = function () { var result = { status : true, data : [], error : '' }; var liTemp; var objTemp; $('.treeview-gray input:checkbox:checked').each(function (i) { liTemp = $(this).parent('li'); objTemp = {}; objTemp.carBrandId = liTemp.attr('value'); objTemp.brand = liTemp.attr('brand'); objTemp.carBrandName = liTemp.find('span').text(); objTemp.unitPrice = liTemp.find('input:text').val(); // 如果价格没有输入,返回保存失败,并返回没有输入的carBrandName if(objTemp.unitPrice == '') { result.status = false; result.error = '请输入 ' + objTemp.carBrandName + ' 的价格!'; return result; } result.data.push(objTemp); }); return result; } // 统计不带价格的返回数据 var getNopriceResult = function () { var result = []; var liTemp; var objTemp; var flag1; var flag2; var flag3; var flag4; var levelName; // 遍历4层 $('#cb_').children().children('li').children('input:checkbox').each(function (i) { if ($(this).is(':checked')) { flag = true; } else { flag = false; } $(this).parent().children().children('li').children('input:checkbox').each(function (i) { if ($(this).is(':checked')) { flag = false; flag = true; } else { flag = false; } // 获取第二级的名字,给第三级使用 liTemp = $(this).parent('li'); level2Name = liTemp.children('span').text(); $(this).parent().children().children('li').children('input:checkbox').each(function (i3) { if ($(this).is(':checked')) { flag1 = false; flag2 = false; flag3 = true; } else { flag3 = false; } $(this).parent().children().children('li').children('input:checkbox').each(function (i4) { if ($(this).is(':checked')) { flag1 = false; flag2 = false; flag3 = false; flag4 = true; } else { flag4 = false; } if (flag4) { liTemp = $(this).parent('li'); objTemp = {}; objTemp.carBrandId = liTemp.attr('value'); objTemp.brand = liTemp.attr('brand'); //objTemp.carBrandName = liTemp.children('span').text(); objTemp.carBrandName = objTemp.brand + ' ' + liTemp.children('span').text(); result.push(objTemp); } }); if (flag) { liTemp = $(this).parent('li'); objTemp = {}; objTemp.carBrandId = liTemp.attr('value'); objTemp.brand = liTemp.attr('brand'); //objTemp.carBrandName = liTemp.children('span').text(); objTemp.carBrandName = objTemp.brand + ' ' + levelName + ' ' + liTemp.children('span').text(); result.push(objTemp); } }); if (flag2) { //liTemp = $(this).parent('li'); objTemp = {}; objTemp.carBrandId = liTemp.attr('value'); objTemp.brand = liTemp.attr('brand'); //objTemp.carBrandName = objTemp.brand + liTemp.children('span').text(); objTemp.carBrandName = objTemp.brand + ' ' + liTemp.children('span').text(); result.push(objTemp); } }); if (flag1) { liTemp = $(this).parent('li'); objTemp = {}; objTemp.carBrandId = liTemp.attr('value'); objTemp.brand = liTemp.attr('brand'); objTemp.carBrandName = liTemp.children('span').text(); result.push(objTemp); } }); return result; } // 给目录树绑定点击事件 $(document).on('click', '#resourceId li', function (e) { e.stopPropagation(); if ($(this).attr('open')) { $(this).removeAttr('open'); $(this).children('ul').hide(); } else { $(this).attr('open', 'opened'); $(this).children('ul').show(); } var objId = $(this).attr('id'); var carBrandId = $(this).attr('value'); //加载过的不执行 if ($(this).attr('data-load')) { return; } loadSubMenu(objId, carBrandId); }); // 点击多选框时候不下拉 $(document).on('click', 'input[type="checkbox"]', function (e) { e.stopPropagation(); }); window.CarTree = CarTree; }());

调用方法:

carTree = new CarTree(false, {}, function (data) {
console.log(data);
});

以上所述是小编给大家介绍的BootStrap实现树形目录组件代码详解的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
author-avatar
XbZSZl_682
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有