`
JavaCrazyer
  • 浏览: 3012201 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类

分享两种comboBoxTree下拉列表树的写法

阅读更多

第一种方式,经过仔细拓展后的,看起来不错,其实有点毛病就是点击下拉列表出来后在点击节点想分开时却有缩了回去,自己解决吧

   ComoboBoxTree-min.js

   

Ext.ux.ComboBoxTree = function() {

this.treeId = Ext.id() + "-tree";

this.maxHeight = arguments[0].maxHeight || arguments[0].height

|| this.maxHeight;

this.tpl = new Ext.Template('<tpl for="."><div style="height:'

+ this.maxHeight + 'px"><div id="' + this.treeId

+ '"></div></div></tpl>');

this.store = new Ext.data.SimpleStore( {

fields : [],

data : [ [] ]

});

this.selectedClass = "";

this.mode = "local";

this.triggerAction = "all";

this.onSelect = Ext.emptyFn;

this.editable = false;

this.selectNodeModel = arguments[0].selectNodeModel || "exceptRoot";

Ext.ux.ComboBoxTree.superclass.constructor.apply(this, arguments)

};

Ext.extend(Ext.ux.ComboBoxTree, Ext.form.ComboBox, {

expand : function() {

Ext.ux.ComboBoxTree.superclass.expand.call(this);

if (!this.tree.rendered) {

this.tree.height = this.maxHeight;

this.tree.border = false;

this.tree.autoScroll = true;

if (this.tree.xtype) {

this.tree = Ext.ComponentMgr.create(this.tree, this.tree.xtype)

}

this.tree.render(this.treeId);

var B = this;

this.tree.on("click", function(F) {

var E = (F == B.tree.getRootNode());

var D = B.selectNodeModel;

var C = F.isLeaf();

if (E && D != "all") {

return

} else {

if (D == "folder" && C) {

return

} else {

if (D == "leaf" && !C) {

return

}

}

}

B.setValue(F);

B.collapse()

});

var A = this.tree.getRootNode();

if (!A.isLoaded()) {

A.reload()

}

}

},

setValue : function(A) {

var B = A.text;

this.lastSelectionText = B;

if (this.hiddenField) {

this.hiddenField.value = A.id

}

Ext.form.ComboBox.superclass.setValue.call(this, B);

this.value = A.id

},

getValue : function() {

return typeof this.value != "undefined" ? this.value : ""

}

});

Ext.reg("combotree", Ext.ux.ComboBoxTree);

 

 



ComboBoxTree.js

 

 

Ext.ux.ComboBoxTree = function(){

this.treeId = Ext.id()+'-tree';

this.maxHeight = arguments[0].maxHeight || arguments[0].height || this.maxHeight;

this.tpl = new Ext.Template('<tpl for="."><div style="height:'+this.maxHeight+'px"><div id="'+this.treeId+'"></div></div></tpl>');

this.store = new Ext.data.SimpleStore({fields:[],data:[[]]});

this.selectedClass = '';

this.mode = 'local';

this.triggerAction = 'all';

this.onSelect = Ext.emptyFn;

this.editable = false;



//all:所有结点都可选中

//exceptRoot:除根结点,其它结点都可选

//folder:只有目录(非叶子和非根结点)可选

//leaf:只有叶子结点可选

this.selectNodeModel = arguments[0].selectNodeModel || 'exceptRoot';



Ext.ux.ComboBoxTree.superclass.constructor.apply(this, arguments);

}




Ext.extend(Ext.ux.ComboBoxTree,Ext.form.ComboBox, {



expand : function(){

Ext.ux.ComboBoxTree.superclass.expand.call(this);

if(!this.tree.rendered){

this.tree.height = this.maxHeight;

this.tree.border=false;

this.tree.autoScroll=true;

       if(this.tree.xtype){

this.tree = Ext.ComponentMgr.create(this.tree, this.tree.xtype);

}

this.tree.render(this.treeId);

       var combox = this;

       this.tree.on('click',function(node){

        var isRoot = (node == combox.tree.getRootNode());

        var selModel = combox.selectNodeModel;

        var isLeaf = node.isLeaf();

        if(isRoot && selModel != 'all'){

        return;

        }else if(selModel=='folder' && isLeaf){

        return;

        }else if(selModel=='leaf' && !isLeaf){

        return;

        }

        combox.setValue(node);

        combox.collapse();

       });

var root = this.tree.getRootNode();

if(!root.isLoaded())

root.reload();

}

    },

    

setValue : function(node){

        var text = node.text;

        this.lastSelectionText = text;

        if(this.hiddenField){

            this.hiddenField.value = node.id;

        }

        Ext.form.ComboBox.superclass.setValue.call(this, text);

        this.value = node.id;

    },

    

    getValue : function(){

     return typeof this.value != 'undefined' ? this.value : '';

    }

});




Ext.reg('combotree', Ext.ux.ComboBoxTree);

 


 


产生节点的JSP页面getNodes.jsp

 

<%@ page language="java" contentType="text/html; charset=utf-8" %>

<%

String id = request.getParameter("node");

String listNode = "[";

if(id.length()<5){

for(int i=1;i<6;i++){

listNode += "{id:'"+i+"_"+id+"',text:'folder"+i+"_"+id+"'},";

}

listNode = listNode.substring(0,listNode.length()-1) + "]";

}else{

for(int i=1;i<6;i++){

listNode += "{id:'"+i+"_"+id+"',text:'node"+i+"_"+id+"',leaf:true},";

}

listNode = listNode.substring(0,listNode.length()-1) + "]";;

}

out.print(listNode);



%>


 

 

 



第二种方式,是没有经过拓展直接拿来用的,感觉比较容易,就是视觉上多出了一个形如面板的expand的东西,自己也可以去研究下
JSP页面如下
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="base" value="${pageContext.request.contextPath}" />
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>Customizing ComboBoxTree</title> 
<link rel="stylesheet" type="text/css" href="${base}/extjs3.1/resources/css/ext-all.css" />
<script type="text/javascript" src="${base}/extjs3.1/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="${base}/extjs3.1/ext-all.js"></script>
<script type="text/javascript">
var path="${base}/";
</script> 
<script type="text/javascript"> 
Ext.BLANK_IMAGE_URL = path+'extjs3.1/resources/images/default/s.gif';; 
Ext.onReady(function(){ 
var comboxWithTree = new Ext.form.ComboBox({   
       store:new Ext.data.SimpleStore({fields:[],data:[[]]}),   
       editable:false,   
       mode: 'local',   
       triggerAction:'all',   
       maxHeight: 200,   
       tpl: "<tpl for='.'><div style='height:200px'><div id='tree'></div></div></tpl>",   
       selectedClass:'', 
  onSelect:Ext.emptyFn   
   });   
   var tree = new Ext.tree.TreePanel({   
       loader: new Ext.tree.TreeLoader({dataUrl:path+'ComboBoxTree/getNodes.jsp'}),   
       border:false,   
       root:new Ext.tree.AsyncTreeNode({text: '模板根目录',id:'0'})   
     });   
     tree.on('click',function(node){   
         comboxWithTree.setValue(node.text);   
         comboxWithTree.collapse();   
     });   
     comboxWithTree.on('expand',function(){   
       tree.render("tree");   
     });   
     comboxWithTree.render('comboxWithTree'); 
}); 
</script> 
    <body>
    <div>
    <div id="comboxWithTree">
     </div>
    <div id="tree"></div>
    </div>
</body> 
</html>

 
这两种方式都可以用那个产生子节点的页面



 

1
1
分享到:
评论
1 楼 paddycq 2015-11-11  
你好 请问我如果要在该树选定后控制一个html select标签该如何做?或者说,在树选定节点后,动态增加监听选定事件?

相关推荐

    FPGA状态机的两种写法

    FPGA状态机的两种写法 状态机是计算机科学和电子工程中的一种基本概念,广泛应用于硬件控制电路设计和软件开发。有限状态机(Finite State Machine,FSM)是一种常用的状态机模型,能够将复杂的控制逻辑分解成有限...

    css中指定下拉列表在firefox中的宽度两种写法

    在firefox火狐浏览器中如何指定下拉列表的宽度,本文提供两种不同的写法,需要了解的朋友可以参考下 在IE下,我们只要指定select的宽度即可.如: 复制代码代码如下:&lt;select name=”ddlDept” id=”ddlDept” style=...

    两种线程池写法

    ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务

    MVP 的两种写法,以及查询,登录注册功能。

    首先,让我们来看看MVP的两种写法: 1. 接口型MVP(Interface-based MVP) 在接口型MVP中,Presenter层通过接口与View和Model进行交互。这样做的好处是提高了代码的解耦度,使得Presenter和View可以独立地进行单元...

    javascript 写的 树形结构( 递归方法 )(普通写法跟对象写法)

    在JavaScript中,我们可以用以下两种方式实现树形结构的递归遍历: 1. **普通写法**:这种写法通常涉及数组和索引来表示节点及其关系。例如,一个节点可能包含一个子节点数组,递归函数会遍历这个数组并对每个子...

    java输入输出流的两种写法

    以下是两种常见的Java输入输出流的写法及其详细解释: 1. 字节流: - **FileInputStream** 和 **FileOutputStream**:这是处理文件输入输出的基本字节流类。`FileInputStream` 用于从文件读取字节,而 `...

    动态树的写法,动态树详细介绍

    动态树是一种数据结构,它在计算机科学中被广泛应用于各种算法和问题解决中。相比于静态树,动态树能够适应数据的变化,允许插入、删除和查询操作高效地进行。本篇文章将深入探讨动态树的实现原理、转化过程以及相关...

    jsp+Servlet+JavaBean分页的两种写法

    下面将详细介绍两种不同的分页实现方法。 方法一:基于请求参数的分页 1. **Servlet处理请求**:当用户点击分页链接时,浏览器发送一个HTTP请求,其中包含当前页码作为请求参数。Servlet接收到请求后,根据页码...

    状态机的两种写法_横或竖

    本文将探讨“状态机的两种写法”,即横式和竖式,以及它们各自的特点和适用场景。 首先,让我们理解状态机的基本概念。状态机是一种数学模型,用于表示一个系统随时间变化的不同状态,以及在不同事件触发下状态之间...

    java路径两种写法.docx 新手资源,小白学习使用,java学习使用

    ### Java路径两种写法详解 #### 一、引言 在Java编程中,处理文件路径是非常常见的需求之一。为了确保程序具有良好的可移植性与兼容性,了解如何正确地使用路径变得尤为重要。本文将深入探讨Java中两种常用的路径...

    输入asc码转字符.zip_输入ASC码转字符的两种傻瓜写法

    下面,我们将深入探讨这两种“傻瓜式”写法。 方法一:使用内置函数 在许多编程语言中,都有内置的函数或方法可以直接将ASCII码转换为字符。例如,在Python中,我们可以使用chr()函数来完成这个任务。假设我们有一...

    FX5U-DDRVI指令-相对定位两种写法

    FX5U-DDRVI指令-相对定位两种写法 - 方法一:梯形图 方法二:梯形图嵌入ST语言

    jQuery实现邮箱下拉列表自动补全功能

    使用jQuery实现邮箱下拉列表自动补全功能,主要涉及到了JavaScript、jQuery库以及前端基础的DOM操作、事件处理等知识点。下面将详细分解这一过程所需掌握的知识点。 ### jQuery基础 - **引入jQuery库**:项目中...

    三菱FX5U-DDRVA指令-相对定位两种写法

    三菱FX5U-DDRVA指令-相对定位两种写法: 方法一:梯形图 方法二:梯形图内嵌ST语言

    javascript下拉列表菜单的实现方法

    之前写过这个《javascript下拉列表中显示树形菜单的实现方法》菜单的体现,但是在写了之后就发现了,不太适合,高度要精准控制,并且还不是很好看。现在采用table来封装,我们知道table的每一行写满了之后,下一行会...

    MQL4写指标两种方法 RSI指些的老式写法.rar_MT4 RSI_bt3_mql4_mql4指标rsi_多周期指标的写法实例

    在金融交易领域,MT4(MetaTrader 4)是一个广泛使用的交易平台,支持自动化交易和自定义技术指标。MQL4是其内置的编程语言...无论选择哪种方法,了解这两种写法都有助于提升MQL4编程技能,更好地定制自己的交易策略。

    png透明另类写法两种解决方案.zip

    这个压缩包提供了两种不同的解决方案,旨在帮助开发者解决PNG透明度的另类写法问题。下面将详细探讨这两种方法。 ### 解决方案一:使用库函数处理PNG透明 这种方法通常涉及使用特定的编程语言库来处理PNG图像的...

    关于layui 下拉列表的change事件详解

    layui下拉列表的`change`事件为开发者提供了一种灵活的方式来处理用户的选择行为,不仅可以获取到选择的值,还能对选择结果做出响应,如更新其他表单元素或显示相应内容。通过`lay-filter`属性和`form.on`方法,可以...

    FX5U-TBL指令-单独表格运行指令-直线插补-两种写法

    FX5U-TBL指令-单独表格运行指令-直线插补-两种写法

Global site tag (gtag.js) - Google Analytics