首页 > 其他分享 >jquery文件夹菜单

jquery文件夹菜单

时间:2024-04-06 10:59:13浏览次数:24  
标签:jquery glyphicon 菜单 function h1 li ul 文件夹 var

上一篇讲到菜单:

手写jquery生成无限极的菜单icon-default.png?t=N7T8https://blog.csdn.net/qq_50145597/article/details/137338101?spm=1001.2014.3001.5502

这一次改成文件夹菜单,效果图如下:

Java对象和后端传入数据可以去看上一篇文章开头就是

css:
<style type="text/css">
  li{
    margin-left: 10%;
    list-style-type: none;
    /*disclosure-closed*/
  }
  .opr-span{
    width: 20%;
  }
  .opr li{
    display:inline-block;
  }
  .opr{
    width: 100px;
    position: absolute;
  }
  .new-li{
    font-size: 60%;
    width: 125%;
  }
  .menu-li{
    margin: 2%;
  }
html:
<div class="parent">
  <ul class="parent_ul" style="background-color: whitesmoke; width: 20%"></ul>
</div>
<ul class="opr">
  <!--添加文件的按钮-->
  <li><span class="opr-span glyphicon glyphicon-file" id="file"></span></li>
  <!--添加文件夹的按钮-->
  <li><span class="opr-span glyphicon glyphicon-folder-close" id="folder"></span></li>
</ul>

html主要写了两个部分,第一个是菜单div。第二个是一个创建文件和文件夹的按钮。

整体的js:
var $opr = $(".opr");
  $(function (){
    $opr.hide();
    init();
    closeAndOpen();
   // $("ul li .menu-ul").hide();
  });

  /**
   * 开光
   */
  function closeAndOpen(){
    let _this;
    var $body = $("body");
    var $oprli = $(".opr li");
    $body.on("click contextmenu","li span",function (e) {
      var children = $(this).parent().children(".menu-ul");
      if (e.type==="click" ){
        children.toggle(500);
        e.stopPropagation();
        $(this).toggleClass(function (){
          if ($(this).is("glyphicon-folder-close")){
            return "glyphicon-folder-close";
          }
          return "glyphicon-folder-open";});
      }
      if (e.type==="contextmenu" && !($(this).hasClass("glyphicon-file")) &&!($(this).hasClass("opr-span"))){
        //console.log($(this).attr("class"))
        e.preventDefault();
        var position = $(this).offset();
        $opr.css({
             top:position.top+"px",
             left:(position.left*(1.1))+"px"
                }).fadeIn(100);
       // console.log(children.attr('class'));
        _this=$(this);
        $(document).one("click", function(){
          $opr.hide();
        });
        e.stopPropagation();
      }
    });

    $oprli.on("click",function () {
      console.log($(this).attr("id"))
      if ($(this).attr("id")==="file"){
        //console.log( _this.parent("li").html())
        var childrens = _this.parent("li").children("ul>li");
         _this.parent().children("ul").append("<li><input class='new-li' value='新建文件夹'"+childrens.length+"/><span class='new-li-delete'>-</span></li>");
      }
    });
    $body.on("click","new-li-delete",function () {
      console.log($(this))
      $(this).parent("li").remove();
      alert($(this))
    });
  }

  /**
   * 初始化函数
   */
  function init(){
    $(".parent>ul>li>ul").remove();
    $.ajax({
      url: '/test/array',
      type: 'GET',
      dataType: 'json',
    }).done(function (data) {
      if (data.rs) {
        var res = data.data;
        var h1 = "<li>菜单";
        h1 =ul(res,h1);
        h1+="</li>";
        $(".parent>ul").append(h1);
        $("ul li .ul-close1").hide();
      }
    }).fail(function () {
    });
  }

  /**
   * 递归菜单
   * @param arry
   * @param h1
   * @returns {*}
   */
  var a1;
  var a2;
  var className;
  var childFlag = 0;
  var ulCloseClass = "";
  function ul(arry){
    if (arry.length===""){
      return "";
    }
    if (arry.length===0){
      return "";
    }
    ulCloseClass = (childFlag===0)?"":" ul-close1";
    var h1="<ul class='menu-ul "+ulCloseClass+ "'>";
    arry.forEach(item=>{
      a1 = (item.url!==null&&item.child.length===0)?"<a href='"+item.url+"'>":"";
      a2 = (item.child.length===0)?"</a>":"";
      className = item.child.length!==0?"glyphicon glyphicon-folder-close":"glyphicon glyphicon-file";
      h1+="<li class='menu-li'>"+a1+"<span class='menu-span "+className+"'" +
              "style=' background-image: url("+item.backgroundImage+"')\">"+item.name+"</span>";
      if (item.child.length!==0){
          childFlag = 1;
          var child = item.child;
          h1+=ul(child);
          childFlag =0;
      }
      h1+=(a2)+"</li>";
    })
    h1+="</ul>";
    return h1;
  }

js也就是想到哪儿写到哪儿,比较繁杂,毕竟不是前端出生,望请谅解。

解析js:

var $opr = $(".opr");
  $(function (){
    $opr.hide();
    init();
    closeAndOpen();
  });
加载js

执行事件{

1.隐藏创建文件夹和文件的按钮;

2.初始化;

3.监听文件<li>标签鼠标点击事件;

}        

没啥技术和坑点;

function init(){
   var h1 = "<li>菜单";
    h1 =ul(data,h1);
    h1+="</li>";
    $(".parent>ul").append(h1);
    $("ul li .ul-close1").hide();
}
初始化函数

注意data是上一篇中的后端传入的data json数据。关闭子菜单。也没啥坑点

  /**
   * 递归菜单
   * @param arry
   * @param h1
   * @returns {*}
   */
  var a1;
  var a2;
  var className;
  var childFlag = 0;
  var ulCloseClass = "";
  function ul(arry){
    if (arry.length===""){
      return "";
    }
    if (arry.length===0){
      return "";
    }
    ulCloseClass = (childFlag===0)?"":" ul-close1";
    var h1="<ul class='menu-ul "+ulCloseClass+ "'>";
    arry.forEach(item=>{
      a1 = (item.url!==null&&item.child.length===0)?"<a href='"+item.url+"'>":"";
      a2 = (item.child.length===0)?"</a>":"";
      className = item.child.length!==0?"glyphicon glyphicon-folder-close":"glyphicon glyphicon-file";
      h1+="<li class='menu-li'>"+a1+"<span class='menu-span "+className+"'" +
              "style=' background-image: url("+item.backgroundImage+"')\">"+item.name+"</span>";
      if (item.child.length!==0){
          childFlag = 1;
          var child = item.child;
          h1+=ul(child);
          childFlag =0;
      }
      h1+=(a2)+"</li>";
    })
    h1+="</ul>";
    return h1;
  }

这个递归函数升级了下,a1,a2都代表根据url是否生成a标签。ulCloseClass,ulCloseClass标记子文件ul,方便初始化时关闭子菜单。childFlag 是辅助标记为子文件的变量,初始为0,发动子文件递归调动时childFlag为1,结束复位为0.className确定确定是否为文件夹或者为文件,写上不同的图标(glyphicon glyphicon-folder-close和glyphicon glyphicon-file)制作好html后返回出去。


  /**
   * 开光
   */
  function closeAndOpen(){
    let _this;
    var $body = $("body");
    var $oprli = $(".opr li");
    $body.on("click contextmenu","li span",function (e) {
      var children = $(this).parent().children(".menu-ul");
      if (e.type==="click" ){
        children.toggle(500);
        e.stopPropagation();
        $(this).toggleClass(function (){
          if ($(this).is("glyphicon-folder-close")){
            return "glyphicon-folder-close";
          }
          return "glyphicon-folder-open";});
      }
      if (e.type==="contextmenu" && !($(this).hasClass("glyphicon-file")) &&!($(this).hasClass("opr-span"))){
        //console.log($(this).attr("class"))
        e.preventDefault();
        var position = $(this).offset();
        $opr.css({
             top:position.top+"px",
             left:(position.left*(1.1))+"px"
                }).fadeIn(100);
       // console.log(children.attr('class'));
        _this=$(this);
        $(document).one("click", function(){
          $opr.hide();
        });
        e.stopPropagation();
      }
    });

    $body.on("click","new-li-delete",function () {
      console.log($(this))
      $(this).parent("li").remove();
      alert($(this))
    });
  }
开关函数

委托函数on,监听对象li标签中的span模块,执行两个函数(click 和contextmenu)。鼠标左键(click)单击时出现文件的开启和闭合,toggle函数负责关闭和开启子文件夹和文件,toggleClass负责改变图标文件夹的样式(开合),如下图

鼠标右击(contextmenu)文件夹时,会出现新建文件和文件夹的图标

后面两个判断是为什么呢?那是因为文件不具有创建文件和文件夹的功能,这是文夹特有的功能。即鼠标右点击文件时,不会产生创建文件和文件夹的图标。还有一个是因为创造文件文件夹的span,不去判断这个span就会去偏移,对于位置问题,我觉得$(this).offset()比较好用,我看很多博主推荐event.target().left和top,我这里感觉不是很好用,因为这个事件点击span位置会不断变化,因为span标签是有一定的范围,不好控制,所以用了$(this).offset()确定位置。底下则是定位和执行一次解绑one函数,作用就是点击其他地方时,这个创建的图标就会消失。其他的函数上一篇也有说到,就不过多赘叙了。

总结:

总体写起来还是挺麻烦的,还是一个动态dom确定。工作时我当然优先选择一些框架直接执行,但学习的话,感觉底层还是更好一点。好比说,隐藏在js中是display:none;而jquery直接hide()。有什么想法发表在评论区,大家一起探讨一下。

标签:jquery,glyphicon,菜单,function,h1,li,ul,文件夹,var
From: https://blog.csdn.net/qq_50145597/article/details/137410146

相关文章

  • 如何实现仿微信界面[我的+首页聊天列表+长按菜单功能+添加菜单功能]
    如何实现仿微信界面[我的+首页聊天列表+长按菜单功能+添加菜单功能]一、简介如何实现仿微信界面[我的+首页聊天列表+长按菜单功能+添加菜单功能]采用uni-app实现,可以适用微信小程序、其他各种小程序以及APP、Web等多个平台具体实现步骤如下:下载开发者工具HbuilderX进入......
  • git配置不同文件夹(及其子文件夹)下仓库使用不同配置
    git的user和email配置可以通过下面的方式配置:[email protected]我除了公司的多个项目,也有自己的一些项目,需要在不同的文件夹下配置两套user+email目标:在不同的文件夹下git新建仓库commit时,会自动选择对应的正确配置可以......
  • 教你轻松批量重命名文件夹名称
    在信息化社会的时代,我们每天都在与大量的文件和文件夹打交道。随着时间的推移,这些文件和文件夹的名称可能变得千奇百怪,给我们的日常管理和使用带来诸多不便。此时,如果有一种方法能够轻松批量重命名文件夹名称,那无疑是一件极具价值的事情。今天小编就要实现这个价值,并教给给各位......
  • jquery的blockUI遮罩层的使用(1),bootstrap前端开发
    //pluginmethodforblockingelementcontent$.fn.block=function(opts){if(this[0]===window){$.blockUI(opts);returnthis;}varfullOpts=$.extend({},$.blockUI.defaults,opts||{});this.each(function(){var$el=$(this);if(fullOpts......
  • 局域网配置共享文件夹,开机自动共享
    设置文件夹共享选择文件夹:首先,确定你想要共享的文件夹。共享文件夹:右键点击文件夹,选择“属性”,然后切换到“共享”标签页。点击“高级共享”,勾选“共享此文件夹”,并设置共享名称。配置用户权限在共享设置中,你可以通过点击“权限”按钮来设置哪些用户或用户组可以访问共享文......
  • Win10文件夹共享(有密码的安全共享)(SMB协议共享)
    前言局域网内(无安全问题,比如自己家里wifi)无密码访问,参考之前的操作视频【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全共享方式。0.背景将插到电脑上的移动硬盘里面的音视......
  • java 将文件夹进行压缩,按指定大小进行分卷压缩
    使用方法:SplitZipsplitZip=newSplitZip();splitZip.start(file.getPath(),file.getPath());packageext.xxx.util;importjava.io.*;importjava.util.zip.*;importstaticorg.apache.commons.lang3.StringUtils.isBlank;/***分卷压缩工具*/publicclassSp......
  • 使用inno setup 打包Pyinstaller生成的文件夹
    背景:pyinstaller6.5.0、InnoSetup6.2.21. 需要先使用pyinstaller打包,生成包括exe在内的可执行文件夹注意:直接使用pyinstaller打包,生成的文件夹较大,建议在python安装路径中的Scripts文件夹中,将脚本等文件复制过来,将打包命令中的pyinstaller替换为pyinstaller.exe打包,生成的文......
  • Maven项目,本地jar包导入手动导入到Maven库中 ,也可以直接将jar包放到lib文件夹,右键 Add
    Maven项目,本地jar包导入手动导入到Maven库中,也可以直接将jar包放到lib文件夹,右键AddAsLibrary当你的项目,由于网络或者环境这些问题,无法从maven中央仓库更新jar包到本地的时候,可以尝试下面方法,手动添加jar包到Maven仓库;方法一(推荐):1、需要先拿到你的jar包,copy到本地。例如我......
  • JQuery
    目录简介JQuery对象JQuery的使用Dom对象与JQuery包装集对象JQuery选择器基础选择器层次选择器表单选择器JQueryDom操作操作元素属性操作元素样式操作元素的内容创建元素添加元素删除元素遍历元素JQuery事件ready预加载事件绑定事件JQueryAjax$.ajax$.get$.post$.getJSON简介......