dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法


Posted in PHP onApril 26, 2013

在以前的一个公司内部管理系统(InnerOA)中,对于目录树的构造我采用的是dTree,实现无限级目录显示及右键菜单功能(右键菜单中包括:新建、修改、共享、删除、刷新等功能,如下图所示)

dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法

关于公司内部管理系统(InnerOA)中目录树的一些知识以后有时间将整理并提供源码。

但是dTree唯一遗憾的是不支持拖拽排序功能,这让我在完成InnerOA之后心里一直纠结的问题。在网上查看关于目录树的一些内容,dTree是我目前认为最符合我项目的一个。在一个偶然机会,发现了另一个强大的目录树,也就是本文所说的:dhtmlxTree,支持拖拽功能,然而在源码中并没有找到类似DEMO或功能,仅发现提供一个启用拖拽参数,不过,这也让我决心解决目录树的拖拽排序问题,于是花了点时间研究了一下源码和结合dTree项目所总结的经验,终于实现我的需求:可自由拖拽排序、移植dTree的右键菜单功能,并实现在所选目录上右键单击并弹出菜单,可以当前目录为基础,进行如下操作:

1、在该目录下新建目录

2、修改当前目录名称

3、删除当前目录

4、刷新页面

5、可增加其它功能,比如“共享”。我在公司内部管理系统(InnerOA)中是以windows操作系统的共享为原型,设置“自读共享”或“可写共享”,并可指定对某用户(或多用户甚至全部用户)共享。这样只有设定共享的用户,才可看到共享的内容。

由于无法在线演示,下面用几个图说明一下(源码下载见:http://download.csdn.net/detail/zm2714/4544616):

1、可在任意目录上点击右键,新建目录

dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法

2、可在任意目录上点击右键,修改当前目录。但根目录除外。

dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法

上图说明:根目录不可修改,即图中Books不可修改。此id值为-1。这是一个特殊ID。标志为根目录。

dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法

上图说明:其它任意目录匀可修改。实际使用中,是存在数据库中目录的ID值。上图中“目录ccc”的ID值为3。

dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法

上图说明:修改名称后,点击保存,即可。

3、可拖动根目录之外的任意目录,拖拽排序。

拖拽排序原理:将欲选择中目录拖到其父目录时,更新他的时间为当前时间。按时间DESC排序。这样将出现在“父目录”的第一个。循环此操作,可以实现排序功能。

二、代码实现
1、引用js文件和样式文件

<script language="JavaScript" type="text/JavaScript" src="tree/jQuery1.6.2.js"></script>
<script type="text/javascript" src="tree/dhtmlxcommon.js"></script>
<script type="text/javascript" src="tree/dhtmlxtree.js"></script> 
<script type="text/javascript" src="tree/jquery.contextmenu.js"></script>
<link rel="STYLESHEET" type="text/css" href="tree/dhtmlxtree.css">
<script language="JavaScript" type="text/JavaScript" src="js/dialog/dialog.js"></script>

2、程序实现
<script type="text/javascript">
function showMsg(id,title,icon,str){
  art.dialog.through({id:'msg',title:title,icon:icon,drag:false,lock:true,content:str,ok:function(){art.dialog.close();}});
}
function tondrag(id, id2){
  alert(id);alert(id2);
    return confirm("Do you want to move node " + tree.getItemText(id) + " to item " + tree.getItemText(id2) + "?");
};
$(document).ready(function(){
  //$(document).bind("contextmenu",function(){return false;});
  //$(document).bind("selectstart",function(){return false;});
  tree = new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);
  tree.setSkin('dhx_skyblue');
  tree.setImagePath("./tree/imgs/");
  //tree.setImageArrays("plus", "open2.gif", "open2.gif", "open2.gif", "open2.gif", "open2.gif");
  //tree.setImageArrays("minus", "close2.gif", "close2.gif", "close2.gif", "close2.gif", "close2.gif");
  //设置节点图片 setStdImages('无子目录时的图片','节点展开后的图片','节点未展开时的图片')
  tree.setStdImages("folderClosed.gif", "folderOpen.gif", "folderClosed.gif");
  tree.enableDragAndDrop(1);//允许拖拽
  tree.enableTreeLines(false);
  tree.setOnRightClickHandler(function(id){
    //var i=tree.getSelectedItemId();
    //alert(i);
    tree.selectItem(id);
    $("#mm").val(id);
  });
  tree.setDragHandler(function(id,id2){//id为拖拽目录的ID,id2拖拽终点目录。将id2做为id的父目录。
    //art.dialog.confirm("Do you want to move node " + tree.getItemText(id) + " to item " + tree.getItemText(id2) + "?",function(){
      $.post("tree/move_folder.php",{id1:id,id2:id2},function(tips){
          //art.dialog.through({title:'信息',icon:'face-smile',lock:true,content:tips,ok:function(){art.dialog.close();location.reload();}});
      });
      return true;
    //});
  });
  //tree.setXMLAutoLoading("./tree/get.php");
  tree.loadXML("./tree/get.php");
  setTimeout('a()',500);
});
function a(){//绑定右键菜单。
    $('#treeboxbox_tree span').contextMenu('jqueryDtreeMenu',{
    onContextMenu: function(e) {
      if(1){
          return true;
      }else return false;
    },
    bindings: {
      'new':function(t){
        id=$(t).attr("name");
        id=parseInt(id);
        if(id==-1){
          title='创建目录';
        }else{
          title='在“'+$(t).html()+'”目录下 创建';
        }
        art.dialog.open(global_current_folder+'tree/edit_folder.php?do=create&t_folder_id='+id,{id:'edit',title:title,lock:true,height:'60px',resize:false},false);
      },
      'modify':function(t){
        id=$(t).attr("name");
        //“我的文档”中,是以当前用户的“用户名”为根目录的。比如员工的登陆帐号为:郑明,则“我的文档”中,以“郑明”为根目录做为起点。该名称不可更改。增加对$parentId的判断,就是避免给用户造成错觉。
        if(id==-1){
          showMsg(0,'提示','face-smile','该名称不可修改');
          return false;
        }else{
          var name=$(t).html();
          name=encodeURIComponent(encodeURIComponent(name));
          art.dialog.open(global_current_folder+'tree/edit_folder.php?do=modity&name='+name+'&t_folder_id='+id,{id:'edit',title:'修改目录',lock:true,height:'60px',resize:false},false);
        }
      },
      'delete':function(t){
        id=$(t).attr("name");
        if(id==-1){
          showMsg(0,'提示','face-smile','该目录不可删除');
          return false;
        }else{
          var name=$(t).html();
          art.dialog.confirm('确认删除“'+name+'”目录吗?',function(){
           $.post("tree/del_folder.php",{id:id},function(tips){
              art.dialog.through({title:'信息',icon:'face-smile',lock:true,content:tips,ok:function(){art.dialog.close();location.reload();}
              });
            });
            return true;
          });
        }
      },
      'refresh': function(t) {
        location.reload();
      }
    }
  });
}
</script>
<table>
<tr>
  <td valign="top">
  <div id="treeboxbox_tree" style="width:250px;height:218px;background-color:#f5f5f5;border:1px solid Silver;"></div>
  </td>
</tr>
</table>
<input type="text" id="mm" value="">
<style>
  .m{font-size:13px;padding-left:5px;}
</style>
<!-- 右键菜单 开始 -->
<div class="contextMenu" id="jqueryDtreeMenu" style="display:none;">
  <ul>
    <li id="new"><img src="tree/rightkey_menu_img/folder.png" /><span class="m">新建</span></li>
    <li id="modify"><img src="tree/rightkey_menu_img/disk.png" /><span class="m">修改</span></li>
    <li id="delete"><img src="tree/rightkey_menu_img/cross.png" /><span class="m">删除</span></li>
    <li id="refresh"><img src="tree/rightkey_menu_img/refresh.png" /><span class="m">刷新</span></li>
  </ul>
</div>
<!-- 右键菜单 结束 -->

上面源码中的一些注释语句,可以在测试时恢复并可查看所需要的值。有益于理解本篇文章所述的功能并快速应用于你的实际项目中,同时欢迎交流。

对dhtmlXTree的详细使用,就不在本篇范围之内了。你可以参考网上关于dhtmlXTree的使用教程。

PHP 相关文章推荐
粗略计算在线时间,bug:ip相同
Dec 09 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
PHP函数getenv简介和使用实例
May 12 PHP
php生成带logo二维码方法小结
Apr 08 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 #PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 #PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 #PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 #PHP
Eclipse中php插件安装及Xdebug配置的使用详解
Apr 25 #PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 #PHP
PHP中操作ini配置文件的方法
Apr 25 #PHP
You might like
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
Python脚本实现代码行数统计代码分享
2015/03/10 Python
详细探究Python中的字典容器
2015/04/14 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
python实现名片管理系统项目
2019/04/26 Python
用python写测试数据文件过程解析
2019/09/25 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
基于Python 函数和方法的区别说明
2021/03/24 Python
业务副厂长岗位职责
2014/01/03 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
校车司机安全责任书
2015/05/11 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书