`
karlhell
  • 浏览: 106609 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

KvaTree-Jquery-plugin研究使用

    博客分类:
  • JS
阅读更多
[b][/b]KvaTree 的官方站点:http://www.kvaq.sk/en/kvatree-jquery-plugin.html

Version:
Jquery.js  –  jQuery library v1.2.6 (full, not packed)
Jquery-ui-personalized-1.5.3.min.js  –  jQuery UI v1.5.3 (ui.core,ui.draggable,ui.droppable)
kvaTree.js  – kvaTree js file (full, not packed)
kvaTree.min.js  –  kvaTree js file packed

kvaTree核心库kvaTree.min.js的功能及事件:

kvaTree  — 设置Tree

可以设置Tree:是否默认打开、背景色、图片路径、是否运行事件
设置方式如下:
kt.options = {
                autoclose: true,
                background: 'white',
                imgFolder: 'img/',
                overrideEvents: false,
                multi: true,
                dragdrop: true,
                onClick: false,
                onDblClick: false,
                onExpand: false,
                onCollapse: false,
                onAddNode: false,
                onEditNode: false,
                onDeleteNode: false,
                onDrag: false,
                onDrop: false
            };


InitKvaTree — 初始化生成Tree
数据构建Tree

InitDragDrop — 拖拽事件
拖拽节点或者叶节点将其加入其他节点下,这里我做了改动,将拖拽后的节点记录新的上级节点的ID
加入代码:
//change parentId
 var li    = $(this).parents('li:first');
 var lin   = $(this).parents('li.node:first');

li.removeAttr('parentId');
li.attr('parentId',lin.attr('id'));


CancelDragDrop — 清除拖拽事件
清理

AddNode — 添加节点或者叶节点
这里做了改动,新添加的新节点或叶节点,会记录上级节点的ID,并且为自身随机生成一个ID
可以在加入名称时直接加入对应的URL
格式为:[name],[URL]
例:Downloads,down.action

改动代码如下:

// arented 
var  arented = lin.attr(‘id’);
//random id
var id = Math.random()*101-1;
var nli=’<li’+cn+’ id=’+id+’  arented=’+ arented+’><span id=”tree” class=”text”>&nbsp;</span><input type=”text” value=”New item” /></li>’;



EditNode — 编辑节点或者叶节点
通过编辑可以修改节点或叶节点的名称,及URL

DeleteNode — 删除节点
删除节点或者叶节点,删除节点时子节点及叶节点都会被删除。

SaveInput — 保存AddNode和EditNode操作结果
保存添加或者编辑的操作结果,由于加入了id、parentId、URL属性,所以保存时此方法要做修改,修改代码如下:
var li=$(input).parents(‘li:first’);
//remove url
li.removeAttr(‘url’);
//add url
li.attr(‘url’,val.split(‘,’)[1]);
//add text
input.replaceWith(‘<span id=”tree” class=”active text”>’+val.split(‘,’)[0]+’</span>’);


IeSetStyles — 初始化页面时判断节点是否默认展开
如果想在初始化页面时,节点默认展开,设置方法<li class=”open”>

Clean — 节点间的虚线背景
节点展开或者收缩重新设置虚线效果

AddSigns —节点展开或收起时添加标记
初始化Tree时为默认展开的节点和默认关闭的节点添加标记

BindEvents — 处理点击Tree时的效果处理
节点的展开和收缩,此处还扩展了双击节点打开相应的URL功能
添加功能代码:

//redirect URL
var li = clicked.parents('li:first');
var url = li.attr('url');
//LOAD URL 
//$("#url").load(url);
$("#url").load('test.html');


ToggleNode — 收起或者展开节点
根据节点的Class属性是否为’open’ 调用ExpandNode或CollapseNode事件

ExpandNode — 展开节点
CollapseNode — 收起节点

数据传输
这里使用JSON作为前台页面和后台Struts2的数据传输格方式。
前台用Jquery的$.ajax方法获取JSON数据,使用递归算法遍历出所有的节点及叶节点输出到页面,kvaTree.min.js库负责生成树型菜单并承担对Tree的相关操作。
编辑后的Tree通过JavaScript读取封装成JSON格式,并用$.ajax方法提交到后台。

DEMO说明
服务器如何构造Tree的数据
Tree的POJO类:
SimpleTreeNode.java
public class SimpleTreeNode {
        private Object id;
        private String text;
        private Object parentId;
        private String url;
        //省略Get Set method
        /**
         * 仅用于需要异步读取数据的文件夹节点。当节点有子节点时,该属性不起作用。节点永远为文件夹节点 
         */
        private boolean isfolder=false; 
        private HashMap<String, Object> attrs=new HashMap<String,Object>();
        
        public SimpleTreeNode(Object id, String text,Object parentId){
                this.id=id;
                this.text=text;
                this.parentId=parentId;
        }
        
        public SimpleTreeNode(Object id, String text, Object parentId,boolean isFolder){
                this.id=id;
                this.text=text;
                this.parentId=parentId;
                this.isfolder=isFolder;
        }
        
        public SimpleTreeNode(Object id, String text, Object parentId,boolean isFolder,String url){
                this.id=id;
                this.text=text;
                this.parentId=parentId;
                this.isfolder=isFolder;
                this.url = url;
        }
        
        public SimpleTreeNode(Object id, String text, Object parentId,boolean isFolder,HashMap<String,Object> attrs){
                this.id=id;
                this.text=text;
                this.parentId=parentId;
                this.isfolder=isFolder;
                this.attrs=attrs;
        }
        
        public void addAttribute(String key,Object value){
                
                this.attrs.put(key, value);
        }
        
}


Action类:
Action中的demoTest()方法用于构建Tree数据
TreeAction.java
public class TreeAction extends ActionSupport {
        
        private List<SimpleTreeNode> nodes=new ArrayList();
        private SimpleTreeNode simpletree;
                //省略Get Set method
        //create Tree data
        public String demoTest(){
                
                nodes.add(new SimpleTreeNode(1,"Item 1 here ",0,true,"www.joyplus.com.cn"));
                nodes.add(new SimpleTreeNode(2,"Item 2 here ",0,true,"www.google.com"));
                nodes.add(new SimpleTreeNode(3,"Item 3 here ",1,true,"dev.joyplus.com.cn"));
                nodes.add(new SimpleTreeNode(4,"Item 4 here ",1,true,"mail.joyplus.com.cn"));
                nodes.add(new SimpleTreeNode(5,"Item 5 here ",2,true,"tools.google.com"));
                nodes.add(new SimpleTreeNode(6,"Item 6 here ",2,true,"dev.google.com"));
                nodes.add(new SimpleTreeNode(7,"Item 7 here ",5,true,"map.google.com"));
                nodes.add(new SimpleTreeNode(8,"Item 8 here ",6,true,"gson.google.com"));
                //from DAO rocessing
                //.........
                //.........
                return SUCCESS;
        }
        
        //save Tree's update
        public String saveTree(){
                ActionContext ctx = ActionContext.getContext();
                String json = ctx.getParameters().keySet().toString().substring(1, ctx.getParameters().keySet().toString().length()-1);
                System.out.println(json);
                //JSONObject js = JSONObject.fromObject(json);
                try {
                        Object obj = JSONUtil.deserialize(json);
                        List list = (List) ((Map)obj).get("nodes");
                        
                        for(int i = 0; i<list.size();i++){
                                Map map = (Map)list.get(i);
                                System.out.print(map.get("id")+"      ");
                                System.out.print(map.get("text")+"      ");
                                System.out.print(map.get("parentId")+"      ");
                                System.out.print(map.get("isfolder")+"      ");
                                System.out.print(map.get("url")+"      ");
                                System.out.println("");
                                
                                //nodes.add(new SimpleTreeNode(map.get("id"),(String)map.get("text"),map.get("parentId"),(Boolean)map.get("isfolder"),(String)map.get("url")));

                                //add DAO Processing
                                //...........
                                //...........
                        }
                        
                } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return SUCCESS;
        }
        

        
}


Struts xml的配置
Struts-tree.xml
<struts>
        <package name="tree" extends="json-default">
        <action name="tree" class="org.kvatree.action.TreeAction" >
            <result  type="json" />
        </action>
        </package>
</struts>

页面获取JSON数据生成Tree
Jquery获取JSON数据,并生成Tree
$(document).ready(function(){
        //获取JSON数据
         $.ajax({
                    type: "POST",
                    url: "tree!demoTest.action",
                    dataType: "json",
                   // data:{id:"ab"},
                    success: function(data){
                      treeDate(data,0,0,"","");
                    },
                    error:function() {alert('数据传送失败');}
                });
                
         $("#divtree").ajaxComplete(function(event,request, settings){
              var obj  = $('ul#tree1');
            var opts = {
                multi: false
            };
            obj.kvaTree(opts);
            Bind('.ctrls:eq(0)',obj);
     });

});

//递归生成Tree数据
function treeDate(data,defid,flag,li,ul,pid){
        var ulflag = 0;
        var dataLength = data.nodes.length;

        if(defid==0){
        for(var i=0;i < dataLength;i++){
                 ul = document.createElement("ul");
                if(data.nodes[i].parentId==defid){
                defid = data.nodes[i].id;
                
          li = document.createElement('li');
          li.id=data.nodes[i].id;
          li.parentId=data.nodes[i].parentId;
          li.url=data.nodes[i].url;
  
     
         li.innerHTML = "<span id='tree'>"+data.nodes[i].text+"</span>";
         
        $("#divtree").append(li);
        
        treeDate(data,defid,flag+1,li,"",pid);
        if(flag==0){
                defid=0;
        }
        }
        }
       }else{
                       for(var k=0;k < dataLength;k++){
                               if(ul==""){
                               
                                 ul = document.createElement("ul");
                               }
                               if (data.nodes[k].parentId == defid) {
                                
                               if(typeof(pid)!="undefined"&&ulflag==0){
                                       ul = document.createElement("ul");
                                       ulflag = 1;
                               }
                               if(typeof(pid)=="undefined"){
                                       ulflag = 0;
                               }
                 li1 = document.createElement('li');
                 li1.id=data.nodes[k].id;
                           li1.parentId=data.nodes[k].parentId;
                           li1.url=data.nodes[k].url;
                          
                           
                                li1.innerHTML = "<span id='tree'>"+data.nodes[k].text+"</span>";

                ul.appendChild(li1);
                li.appendChild(ul);
      
                               var temp = defid;
                               defid = data.nodes[k].id;
                               treeDate(data,defid,flag+1,li1,ul,data.nodes[k].parentId)
                               flag = flag-1;
                               defid = temp;
                       }
               }
       } 
                
}


双击节点LOAD页面
双击触发BindEvents事件中嵌套的dblclick事件并LOAD进URL的页面

节点被修改或新增删除后提交
页面新加了一个update node / leaf 链接<p class="update">update node / leaf</p>
修改后的Tree可通过点击此链接提交到后台Action 的saveTree()方法处理
也可在页面关闭事件中增加提交的事件

相关javaScript代码:
$(".update").click(
        function(){
                var tree  = $('ul#tree1');
                var li = $('li');
                
                var actel=tree.find('span').get(1);
                var json="";;
                //alert($('ul#tree1').html());
                for(var i=0;i<li.length;i++){
                        var actel = tree.find('span').get(i);
                        var spanFlag = $(actel).attr('id');
                        if(actel&&spanFlag=="tree"){
                         var selfli=$(actel).parents('li:first');
                         
                         var text = $(actel).text();
                         var id = selfli.attr('id');
                         var parentId = selfli.attr('parentId');
                         var url = selfli.attr('url');
                         
                         json = json+"{'id':"+id+", 'isfolder':true ,'parentId':"+parentId+" ,'text':'"+text+"' ,'url':'"+url+"'},"
                }
                }
                json = "{'nodes' : ["+json.substring(0,json.length-1)+"]}";
                
                $.ajax({
                   type: "POST",
                   url: "tree!saveTree.action",
                   dataType: "json",
                   data: json,
                   success: function(json){
                    alert('submit success');
              treeDate(json,0,0,"","");
                   },
                   error:function() {alert('数据传送失败');}
             }); 
             

                
        }
)
分享到:
评论

相关推荐

    struts2-jquery-plugin-3.1.0.jar

    struts2-jquery-plugin-3.1.0.jar

    struts2-jquery-plugin使用手册,自己写的

    - Struts2-jQuery-Plugin支持自定义JavaScript事件处理,可以使用`onComplete`、`beforeSubmit`等属性绑定回调函数,实现更复杂的业务逻辑。 - 使用`event`属性,可以触发特定的jQuery事件,如`open`、`close`等。...

    struts2-jquery-plugin-2.0.0

    struts2-jquery-plugin-2.0.0 struts2-jquery-plugin-2.0.0 struts2-jquery-plugin-2.0.0

    struts2-jquery-plugin插件3.3.3

    最新的struts2-jquery-plugin插件3.3.3,包括jquery-ui和grid,使用标签实现。

    前端项目-Iframe-Height-Jquery-Plugin.zip

    针对这一问题,`前端项目-Iframe-Height-Jquery-Plugin` 提供了一个解决方案。 这个jQuery插件的主要功能是自动检测并设置Iframe的高度,确保内容完整显示,同时解决了跨域通信的问题。跨域问题通常发生在iframe...

    jonpauldavies-jquery-pager-plugin-aa0c5b4.zip

    在使用过程中,开发者需要将下载的jonpauldavies-jquery-pager-plugin-aa0c5b4.zip解压,其中包含的主要文件可能有以下几种: 1. `jquery.pager.js`:这是核心的JavaScript文件,实现了分页逻辑和交互。 2. `jquery...

    前端项目-jquery-fullscreen-plugin.zip

    前端项目-jquery-fullscreen-plugin,这个jquery插件提供了一个简单易用的机制来控制现代浏览器的新全屏模式。目前只有更新的基于webkit的浏览器(如chrome)和firefox提供了这个新的全屏功能。

    struts2-jquery-plugin

    struts2 jquery plugin ,学习struts2 ,又希望在其中使用Jquery的朋友,不妨看看

    struts2-jquery-plugin-3.6.1.jar

    struts2-jquery-plugin

    jQuery plugin for autocomplete - jQuery自动完成插件

    jQuery plugin for autocomplete - jQuery自动完成插件

    struts2-jquery-plugin-3_7_1

    struts2-jquery-plugin jar文件

    Sonar-pdfreport-plugin插件英文报告版

    sonar-pdfreport-plugin-4.0.1英文pdf报告版,适用于SonarQube9.x版本 sonarQube 9.9.2-community 和postgres 13使用完全正常

    struts2-jquery-grid-plugin-3.5.1.jar

    struts2-jquery-grid-plugin-3.5.1.jar 此jar包适合于struts2框架,一标签的形式实现grid插件,不过目前网络上此插件中文文档较少。

    jQuery摄像头插件jquery-webcam-plugin

    要使用`jQuery webcam plugin`,首先需要在项目中引入jQuery库以及插件的JavaScript和CSS文件。接着,需要在HTML中创建一个用于显示摄像头预览的元素,例如一个`div`,并为其添加特定的ID。然后,通过以下JavaScript...

    前端项目-jquery-teletype-plugin.zip

    【前端项目-jquery-teletype-plugin.zip】是一个包含前端开发中的jQuery插件资源的压缩包。这个插件名为"teletype",它的主要功能是模拟人类在输入文本时的行为,比如逐步显示文本并可选择性地删除内容,从而营造出...

    sonar-pdfreport-plugin-3.0.3.jar

    sonar-pdfreport-plugin 已经对static 下 download.js 错误路径进行修改 sonar-pdf-plugin 3.0.3 适用SONARQUBE6.3+ ,生成 sonarqube 项目报告 report ,2积分好事成双,免去打包浪费时间

    atlassian-universal-plugin-manager-plugin-2.17.13.jar

    将atlassian-universal-plugin-manager-plugin-2.17.13.jar 替换到 jira/atlassian-jira-6.3.6-standalone/atlassian-jira/WEB-INF/atlassian-bundled-plugins/ 重新启动jira 用管理员账户登录jira

    Bootstrap-video-player-jQuery-plugin-master全套dom

    在压缩包"Bootstrap-video-player-jQuery-plugin-master"中,你将找到源代码、示例、文档和可能的资源文件,这些都将帮助你理解和使用这个插件。通过阅读文档,你可以了解如何配置和自定义播放器,以及如何解决可能...

    前端开源库-jquery-word-and-character-counter-plugin

    前端开源库-jquery-word-and-character-counter-pluginjquery单词和字符计数器插件,这个单词和字符计数器插件允许您向上或向下计数字符或单词。您可以设置计数器要达到的最小或最大目标。还有甜蜜的选择。

Global site tag (gtag.js) - Google Analytics