打造基于jQuery的高性能TreeView(asp.net)分分快三计划

作者:分分快三计划

依靠 HTML5 Canvas 的交互式客车线路图

2018/03/14 · HTML5 · Canvas

原作出处: xhload3d   

 前言

前两日在 echarts 上探求灵感的时候,看到了累累关于地图类似的例子,地图定位等等,可是好像便是未有大巴线路图,就和好花了有的年华捣鼓出来了这一个交互式客车线路图的 德姆o,大巴线路上的点是在互连网随意下载了一个,那篇作品记录本身的一部分收获(终归自身照旧个新手)以及代码的贯彻,希望能够帮到一些有爱人。当然,假若有哪些观念的能够直接跟本人说,大家一齐交换才会升高。

大家清楚,矩阵能描述任性线性别变化换。线性别变化换保留了直线和平行线,线性别变化换保留直线的还要,其余的几何性质如长度、角度、面积和体积也许被转移更改了。简单来说,线性别变化换大概“拉伸”坐标系,但不会“盘曲”或“卷折”坐标系。这几个函数首假诺将我们的连接线在拖动掸力球后被拖拉的接连线的进展七个“变化矩阵”的操作,变化矩阵也是 HT 封装的 ht.Default.createMatrix 函数,通过将节点的 style 属性 mat 设置为八个自定义的函数,便是将以此节点的坐标乘上在“mat”属性对应的值,也便是说如若当前以此管线的团团转角为 [Math.PI/6, 0, 0],借使大家在 createMatrix 函数中设置 r3 为 [Math.PI/3, 0, 0],那么这几个节点会旋转 90 度。非常轻巧地创设出调换矩阵:

复制代码 代码如下:

交互

第一是鼠标移动事件,鼠标滑过具体路线时,线路会变粗,悬停一会儿还能够收看那条路径的号码;当鼠标移动到“换乘站点”或“小站点”,站点对应的Logo都会变大况且变色,字体也会变大,鼠标移开Logo变回原本的水彩并且字体变小。不一致点在于鼠标移动到“换乘站点”时,“换乘站点”会旋转。

分分快三计划 1

鼠标滑动事件,作者直接基于 gv 的最底层 div 进行的 mousemove 事件,通过 ht 封装的 getDataAt 函数字传送入事件 event 参数,获取事件下相应的节点,然后就足以私自操作节点了:

gv.getView().add伊芙ntListener('mousemove', function(e) { var data = gv.getDataAt(e);//传入逻辑坐标点只怕交互event事件参数,再次来到当前点下的图元 if(name) { originNode(name);//不管曾几何时都要让节点保持原本的大小 } if (data instanceof ht.Polyline) {//判定事件节点的品种 dm.sm().ss(data);//选中“管道” name = ''; clearInterval(interval); } else if (data instanceof ht.Node) { if(data.getTag() !== name && data.a('tpNode')) {//若不是同多少个节点,并且mousemove的事件目的为ht.Node类型,那么设置节点的转动 interval = setInterval(function() { data.setRotation(data.getRotation()

  • Math.PI/16); //在本身旋转的根基上再旋转 }, 100); } if(data.a('npNode')) {//要是鼠标移到“小站点”也要结束动画 clearInterval(interval); } expandNode(data, name);////自定义的推广节点函数,比较便于,我不粘代码了,可以去 查看 dm.sm().ss(data);//设置选中节点 name = data.getTag();//作为“上二个节点”的蕴藏变量,能够因而这些值来取得节点 } else {//别的任何动静则不选中任何内容还要消除“换乘站点”上的卡通 dm.sm().ss(null); name = ''; clearInterval(interval); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
gv.getView().addEventListener('mousemove', function(e) {
    var data = gv.getDataAt(e);//传入逻辑坐标点或者交互event事件参数,返回当前点下的图元
    if(name) {
        originNode(name);//不管什么时候都要让节点保持原来的大小
    }
 
    if (data instanceof ht.Polyline) {//判断事件节点的类型
        dm.sm().ss(data);//选中“管道”
        name = '';
        clearInterval(interval);
    }
    else if (data instanceof ht.Node) {
        if(data.getTag() !== name && data.a('tpNode')) {//若不是同一个节点,并且mousemove的事件对象为ht.Node类型,那么设置节点的旋转
            interval = setInterval(function() {
                data.setRotation(data.getRotation() - Math.PI/16); //在自身旋转的基础上再旋转
            }, 100);
        }
        if(data.a('npNode')) {//如果鼠标移到“小站点”也要停止动画
            clearInterval(interval);
        }
        expandNode(data, name);////自定义的放大节点函数,比较容易,我不粘代码了,可以去http://hightopo.com/   查看
        dm.sm().ss(data);//设置选中节点
        name = data.getTag();//作为“上一个节点”的存储变量,可以通过这个值来获取节点
    }
    else {//其他任何情况则不选中任何内容并且清除“换乘站点”上的动画
        dm.sm().ss(null);
        name = '';
        clearInterval(interval);
    }
});

鼠标悬停在大巴线路上时显得“具体线路消息”,小编是通过安装 tooltip 来产生的(注意:要开荒 gv 的 tooltip 按钮):

gv.enableToolTip();//张开 tooltip 的按钮 if(num === '68') polyline.setToolTip('A P M');//设置提醒新闻 else if(num === '60') polyline.setToolTip('G F'); else polyline.setToolTip('Line' num);

1
2
3
4
gv.enableToolTip();//打开 tooltip 的开关
if(num === '68') polyline.setToolTip('A P M');//设置提示信息
else if(num === '60') polyline.setToolTip('G F');
else polyline.setToolTip('Line' num);

然后本身动用右下角的 form 表单,单击表单上的求实线路,或许双击拓扑图上随意三个“站点”也许线路,则拓扑图会自适应到相应的一些,将被双击的一些呈现到拓扑图的宗旨。

分分快三计划 2

form 表单的宣示部分本人就好像还向来不表明。。。正是经过 new 二个ht.widget.FomePane 类创设两个 form 表单组件,通过 form.getView() 获取表单组件的底层 div,将以此 div 摆放在 body 右下角,然后通过 addRow 函数向 form 表单中加多一行的表单项,能够在这行中增多大肆八个项,通过 addRow 函数的第1个参数(一个数组),对加多进的表单项进行小幅的设置,通过第多少个参数设置那行的惊人:

function createForm() {//创造右下角的form表单 var form = new ht.widget.FormPane(); form.setWidth(200);//设置表单宽度 form.setHeight(416);//设置表单中度 let view = form.getView(); document.body.appendChild(view);//将表单加多进body中 view.style.zIndex = 1000; view.style.bottom = '10px';//ht组件大概都设置相对路线view.style.right = '10px'; view.style.background = 'rgba(211, 211, 211, 0.8)'; names.forEach(function(nameString) { form.addRow([//向表单中加多行 {//这一行中的第二个表单项 button: {//向表单中增多button按钮 icon: 'images/Line' nameString.value '.json',//设置开关的Logo background: '',//设置开关的背景 borderColor: '',//设置开关的边框颜色 clickable: false//设置按钮不可点击 } }, {//第二个表单项 button: { label: nameString.name, labelFont: 'bold 14px arial, sans-serif', labelColor: '#fff', background: '', borderColor: '', onClicked: function() {//开关点击回调事件 gv.sm().ss(dm.getDataByTag(nameString.value));//设置选中按下的开关对应的路径gv.fitData(gv.sm().ld(), true, 5);//将入选的地铁线路突显在拓扑图的宗旨 } } } ], [0.1, 0.2], 23);//第四个参数是安装第一参数中的数组的升幅,小于1是比例,大于1是事实上增进率。第多少个参数是该行的中度}); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function createForm() {//创建右下角的form表单
    var form = new ht.widget.FormPane();
    form.setWidth(200);//设置表单宽度
    form.setHeight(416);//设置表单高度
    let view = form.getView();
    document.body.appendChild(view);//将表单添加进body中
    view.style.zIndex = 1000;
    view.style.bottom = '10px';//ht组件几乎都设置绝对路径
    view.style.right = '10px';
    view.style.background = 'rgba(211, 211, 211, 0.8)';
 
    names.forEach(function(nameString) {
        form.addRow([//向表单中添加行
            {//这一行中的第一个表单项
                button: {//向表单中添加button按钮
                    icon: 'images/Line' nameString.value '.json',//设置按钮的图标
                    background: '',//设置按钮的背景
                    borderColor: '',//设置按钮的边框颜色
                    clickable: false//设置按钮不可点击
                }
            },
            {//第二个表单项
                button: {
                    label: nameString.name,
                    labelFont: 'bold 14px arial, sans-serif',
                    labelColor: '#fff',
                    background: '',
                    borderColor: '',
                    onClicked: function() {//按钮点击回调事件
                        gv.sm().ss(dm.getDataByTag(nameString.value));//设置选中按下的按钮对应的线路
                        gv.fitData(gv.sm().ld(), true, 5);//将选中的地铁线路显示在拓扑图的中央
                    }
                }
            }
        ], [0.1, 0.2], 23);//第二个参数是设置第一参数中的数组的宽度,小于1是比例,大于1是实际宽度。第三个参数是该行的高度
    });
}

单击“站点”呈现石磨蓝标记,双击节点自适应放置到拓扑图宗旨以及双击空白处将玉莲红证明隐蔽的剧情都以通过对拓扑组件 gv 的平地风波监听来支配的,极度清晰易懂,代码如下:

var node = createRedLight();//创立三个新的节点,呈现为“红灯”的体裁 gv.mi(function(e) {//ht 中拓扑组件中的事件监听 if(e.kind === 'clickData' && (e.data.a('tpNode') || e.data.a('npNode'))) {//e.kind获取当前事件类型,e.data获取当前事变下的节点 node.s('2d.visible', true);//设置node节点可见node.setPosition(e.data.getPosition().x, e.data.getPosition().y);//设置node的坐标为当下事件下节点的职位 } else if(e.kind === 'doubleClickData') {//双击节点 gv.fitData(e.data, false, 10);//将事件下的节点自适应到拓扑图的宗旨,参数1为自适应的节点,参数2为是或不是动画,参数3为gv与边框的padding } else if(e.kind === 'doubleClickBackground') {//双击空白处 node.s('2d.visible', false);//设置node节点不可知 查看 HT for Web 样式手册( } });

1
2
3
4
5
6
7
8
9
10
11
12
13
var node = createRedLight();//创建一个新的节点,显示为“红灯”的样式
gv.mi(function(e) {//ht 中拓扑组件中的事件监听
    if(e.kind === 'clickData' && (e.data.a('tpNode') || e.data.a('npNode'))) {//e.kind获取当前事件类型,e.data获取当前事件下的节点
        node.s('2d.visible', true);//设置node节点可见
        node.setPosition(e.data.getPosition().x, e.data.getPosition().y);//设置node的坐标为当前事件下节点的位置
    }
    else if(e.kind === 'doubleClickData') {//双击节点
        gv.fitData(e.data, false, 10);//将事件下的节点自适应到拓扑图的中央,参数1为自适应的节点,参数2为是否动画,参数3为gv与边框的padding
    }
    else if(e.kind === 'doubleClickBackground') {//双击空白处
        node.s('2d.visible', false);//设置node节点不可见 查看 HT for Web 样式手册(http://www.hightopo.com/guide/guide/core/theme/ht-theme-guide.html#ref_style)
    }
});

专心 s(style) 和 a(attr) 定义是那般的,s 是 ht 预约义的一些样式属性,而 a 是大家客户来源定义的本性,一般是经过调用字符串来调用结果的,那几个字符串对应的能够是常量也得以是函数,照旧很利索的。

终极还做了贰个细小的某些,选中“站点”,则该“站点”的上边会来得一个革命的会“呼吸”的用来评释当前相中的“站点”。

分分快三计划 3

“呼吸”的部分是行使 ht 的 setAnimation 函数来成功的,在用那些函数此前要先开拓数据容器的动画按键,然后设置动画:

dm.enableAnimation();//打开数据容器的卡通片按键 function createRedLight() { var node = new ht.Node(); node.setImage('images/红灯.json');//设置节点的图样 node.setSize(1, 1);//设置节点的轻重缓急 node.setLayer('firstTop');//设置节点显示在gv的最上层 node.s('2d.visible', false);//节点不可知 node.s('select.width', 0);//节点选中时的边框为0,不可知 node.s('2d.selectable', false);//设置这么些性子,则节点不可选中 node.setAnimation({//设置动画 具体参见 HT for Web 动画手册( expandWidth: { property: "width",//设置那脾性情,并且未安装 accessType,则暗中同意通过 setWidth/getWidth 来安装和获得属性。这里的 width 和下边包车型地铁 height 都以透过前面设置的 size 获得的 from: 0.5, //动画初步时的属性值 to: 1,//动画甘休时的质量值 next: "collapseWidth"//字符串类型,内定当前动画实现之后,要实践的下个卡通,可将多个卡通融入}, collapseWidth: { property: "width", from: 1, to: 0.5, next: "expandWidth" }, expandHeight: { property: "height", from: 0.5, to: 1, next: "collapseHeight" }, collapseHeight: { property: "height", from: 1, to: 0.5, next: "expandHeight" }, start: ["expandWidth", "expandHeight"]//数组,用于钦赐要运转的八个或五个动画 }); dm.add(node); return node; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
dm.enableAnimation();//打开数据容器的动画开关
function createRedLight() {
    var node = new ht.Node();
    node.setImage('images/红灯.json');//设置节点的图片
    node.setSize(1, 1);//设置节点的大小
    node.setLayer('firstTop');//设置节点显示在gv的最上层
    node.s('2d.visible', false);//节点不可见
    node.s('select.width', 0);//节点选中时的边框为0,不可见
    node.s('2d.selectable', false);//设置这个属性,则节点不可选中
 
    node.setAnimation({//设置动画 具体参见 HT for Web 动画手册(http://www.hightopo.com/guide/guide/plugin/animation/ht-animation-guide.html)
        expandWidth: {
            property: "width",//设置这个属性,并且未设置 accessType,则默认通过 setWidth/getWidth 来设置和获取属性。这里的 width 和下面的 height 都是通过前面设置的 size 得到的
            from: 0.5, //动画开始时的属性值
            to: 1,//动画结束时的属性值
            next: "collapseWidth"//字符串类型,指定当前动画完成之后,要执行的下个动画,可将多个动画融合
        },
        collapseWidth: {
            property: "width",
            from: 1,
            to: 0.5,
            next: "expandWidth"
        },
        expandHeight: {
            property: "height",
            from: 0.5,
            to: 1,
            next: "collapseHeight"
        },
        collapseHeight: {
            property: "height",
            from: 1,
            to: 0.5,
            next: "expandHeight"
        },
        start: ["expandWidth", "expandHeight"]//数组,用于指定要启动的一个或多个动画
    });
    dm.add(node);
    return node;
}

全部代码结束!

slider 和 colorPicker 都是 HT 自定义的滑动条和颜料采取器,详细的情况请参照他事他说加以考察 HT for Web 表双臂册。

  • 正如土的是table套table的(样式上好调整,不过大数据量,和档次较深的树,这种布局自然顶不住的)
  • 还会有一种是比较独特的UL套LI的法门,那是未来无数书采用的章程如Jquery.treeview正是选用的这种格式,好处相比较明白正是构造轻便,
    与此同一时候在不协理Js的浏览器上,一样也能显现出树的模样(这种气象其实笔者能够忽略),然而Jquery.treeview的节点在IE下,非常是IE6下无法被内部因素撑开,(IE7,8当达到一定深度时力不从心撑开),请离奇的现象(我可疑是因为运用padding来做缩进,margin-left:负值来调节Logo地方有关,然则修改起来难度也相当的大),在这种场馆下书会变形(Jquery.treeview)就有这种难题,只好通过安装节点的width来减轻。

总结

其一 德姆o 花了自家二日时间完毕,总以为多少不甘心啊,不过不经常思考又转可是弯来,开支了广大的时光,但是总的来讲收获依旧广大的,小编原先一向以为只要透过 getPoints().push 来向多边形中加多点就能够了,求助了大神之后,发掘原来那几个格局不独有绕弯路并且还有可能会产出美妙绝伦的难点,例如getPoints 此前,应当要在绝一大半形中已经有 points 才足以,可是在好多气象下,开头化的 points 并不好设置,并且会造成代码很麻烦,直接通过 addPoint 方法,直接将点增多进多边形变量中,并且还有或者会暗中认可将点通过直线的主意连接,也不用设置 segments,多喜人的多个函数。

还应该有就是因为 ht 暗中认可缩放大小是 20,而自己那么些 德姆o 的间距又异常的小,导致缩放到最大地铁线路图显示也很小,所以小编在 htconfig 中改换了 ht 的暗中同意 zoom马克斯 属性,记住,更换这些值必要求在颇具的 ht 调用此前,因为在 htconfig 中安装的值在末端定义都以不可退换的。

总的说来,这两日本身的脑部细胞死了相当多,也再一次生长了许多,人都以在不断提高的呗~

1 赞 1 收藏 评论

分分快三计划 4

var createNode = function(dm) {//创建node节点 圆
    var node = new ht.Node();
    node.s({//设置样式为 setStyle 的简写
        'shape3d': 'sphere',
        'shape3d.color': randomColor()//设置随机颜色
    });
    node.s3(40, 40, 40);
    dm.add(node);
    return node;
};

分分快三计划 5

效果图

分分快三计划 6

地图稍微内容有一些多,要任何来得,字显得有一点小了,但是无妨,能够遵从要求加大缩短,字体和制图的内容并不会失真,毕竟都以用矢量绘制的~

<script src="../../guide/lib/core/ht.js"></script>
<script src="../../guide/lib/plugin/ht-forcelayout.js"></script>
<script src="../../guide/lib/plugin/ht-form.js"></script>

地方了树的主干样式外,定义了一个有 号带line的体裁和 号不带line的体裁

界目生成

底层的 div 是经过 ht.graph.GraphView 组件生成的,然后就足以应用 HT for Web 提供好的主意,调用 canvas 画笔随意绘制就好,先来看看怎么生成底层 div:

var dm = new ht.DataModel();//数据容器 var gv = new ht.graph.GraphView(dm);//拓扑组件 gv.addToDOM();//将拓扑图组件增加进body中

1
2
3
var dm = new ht.DataModel();//数据容器
var gv = new ht.graph.GraphView(dm);//拓扑组件
gv.addToDOM();//将拓扑图组件添加进body中

addToDOM 函数阐明如下:

addToDOM = function(){ var self = this, view = self.getView(), style = view.style; document.body.appendChild(view); //将组件底层div增多到body中 style.left = '0';//暗中认可组件是相对定位,所以要设置义务 style.right = '0'; style.top = '0'; style.bottom = '0'; window.add伊夫ntListener('resize', function () { self.iv(); }, false); //窗口变化事件 }

1
2
3
4
5
6
7
8
9
10
11
addToDOM = function(){  
    var self = this,
        view = self.getView(),  
        style = view.style;
    document.body.appendChild(view); //将组件底层div添加到body中          
    style.left = '0';//默认组件是绝对定位,所以要设置位置
    style.right = '0';
    style.top = '0';
    style.bottom = '0';      
    window.addEventListener('resize', function () { self.iv(); }, false); //窗口变化事件          
}

前些天本人就足以在那个 div 上乱涂乱画了~首先作者收获下载好的大巴线路图上的点,笔者将它们位于 subway.js 中,那几个 js 文件全是下载的内容,小编未有做别的的改造,首纵然将那些点根据线路来分分配增添到数组中,举例:

mark_Point13 = [];//线路 数组内富含线路的起源和终点坐标以及那条路径的称呼 t_Point13 = [];//换来站点 数组内富含线路中的换乘站点坐标以及换到站点名称 n_Point13 = [];//小站点 数组内包括线路中的小站点坐标以及小站点名称 mark_Point13.push({ name: '十三号线', value: [113.4973,23.1095]}); mark_Point13.push({ name: '十三号线', value: [113.4155,23.1080]}); t_Point13.push({ name: '鱼珠', value: [113.41548,23.10547]}); n_Point13.push({ name: '裕丰围', value: [113.41548,23.10004]});

1
2
3
4
5
6
7
mark_Point13 = [];//线路 数组内包含线路的起点和终点坐标以及这条线路的名称
t_Point13 = [];//换成站点 数组内包含线路中的换乘站点坐标以及换成站点名称
n_Point13 = [];//小站点 数组内包含线路中的小站点坐标以及小站点名称
mark_Point13.push({ name: '十三号线', value: [113.4973,23.1095]});
mark_Point13.push({ name: '十三号线', value: [113.4155,23.1080]});
t_Point13.push({ name: '鱼珠', value: [113.41548,23.10547]});
n_Point13.push({ name: '裕丰围', value: [113.41548,23.10004]});

接下去来形容大巴线路,小编注脚了一个数组 lineNum,用来装 js 中颇具的地铁线路的号子,以及多个 color 数组,用来装全部的大巴线的颜料,这一个颜色的 index 与 lineNum 中大巴线编号的 index 是各类对应的:

var lineNum = ['1', '2', '3', '30', '4', '5', '6', '7', '8', '9', '13', '14', '32', '18', '21', '22', '60', '68']; var color = ['#f1cd44', '#0060a1', '#ed9b4f', '#ed9b4f', '#007e3a', '#cb0447', '#7a1a57', '#18472c', '#008193', '#83c39e', '#8a8c29', '#82352b', '#82352b', '#09a1e0', '#8a8c29', '#82352b', '#b6d300', '#09a1e0'];

1
2
var lineNum = ['1', '2', '3', '30', '4', '5', '6', '7', '8', '9', '13', '14', '32', '18', '21', '22', '60', '68'];
var color = ['#f1cd44', '#0060a1', '#ed9b4f', '#ed9b4f', '#007e3a', '#cb0447', '#7a1a57', '#18472c', '#008193', '#83c39e', '#8a8c29', '#82352b', '#82352b', '#09a1e0', '#8a8c29', '#82352b', '#b6d300', '#09a1e0'];

继之遍历 lineNum,将 lineNum 中的成分和颜料传到 createLine 函数中,依照那三个参数来绘制地铁线路以及配色,终归 js 文件中的命名方式也许有规律的,哪一条线路,则命名前面确定会助长对应的数字,所以我们只供给将字符串与那几个编号结合就可以获取 js 中对应的数组了:

let lineName = 'Line' num; let line = window[lineName];

1
2
let lineName = 'Line' num;
let line = window[lineName];

createLine 的概念也特别轻巧,作者的代码设置了广大的体制,所以看起来有些多。创设多少个ht.Polyline 管线,大家能够通过 polyline.addPoint() 函数向这一个变量中增加具体的点,通过 setSegments 能够设置点的接连格局。

function createLine(num, color) {//绘制地图线 var polyline = new ht.Polyline();//多边形 管线 polyline.setTag(num);//设置节点tag标签,作为独一标示 if(num === '68') polyline.setToolTip('A P M');//设置提醒消息 else if(num === '60') polyline.setToolTip('G F'); else polyline.setToolTip('Line' num); if(color) { polyline.s({//s 为 setStyle 的简写,设置样式 'shape.border.width': 0.4,//设置多边形的边框宽度 'shape.border.color': color,//设置多边形的边框颜色 'select.width': 0.2,//设置选中节点的边框宽度 'select.color': color//设置选中节点的边框颜色 }); } let lineName = 'Line' num; let line = window[lineName]; for(let i = 0; i < line.length; i ) { for(let j = 0; j < line[i].coords.length; j ) { polyline.addPoint({x: line[i].coords[j][0]*300, y: -line[i].coords[j][1]*300}); if(num === '68'){//APM线(有两条,但是点是在同八个数组中的) if(i === 0 && j === 0) { polyline.setSegments([1]); } else if(i === 1 && j === 0) { polyline.getSegments().push(1); } else { polyline.getSegments().push(2); } } } } polyline.setLayer('0');//将线设置在下层,点设置在上层“top” dm.add(polyline);//将管线增加进数据容器中存款和储蓄,否则这些管线属于“游离”状态,是不会议及展览示在拓扑图上的 return polyline; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function createLine(num, color) {//绘制地图线
    var polyline = new ht.Polyline();//多边形 管线
    polyline.setTag(num);//设置节点tag标签,作为唯一标示
    
    if(num === '68') polyline.setToolTip('A P M');//设置提示信息
    else if(num === '60') polyline.setToolTip('G F');
    else polyline.setToolTip('Line' num);
 
    if(color) {
        polyline.s({//s 为 setStyle 的简写,设置样式
            'shape.border.width': 0.4,//设置多边形的边框宽度
            'shape.border.color': color,//设置多边形的边框颜色
            'select.width': 0.2,//设置选中节点的边框宽度
            'select.color': color//设置选中节点的边框颜色
        });
    }
 
    let lineName = 'Line' num;
    let line = window[lineName];
    for(let i = 0; i < line.length; i ) {
        for(let j = 0; j < line[i].coords.length; j ) {
            polyline.addPoint({x: line[i].coords[j][0]*300, y: -line[i].coords[j][1]*300});
            if(num === '68'){//APM线(有两条,但是点是在同一个数组中的)
                if(i === 0 && j === 0) {
                    polyline.setSegments([1]);
                }
                else if(i === 1 && j === 0) {
                    polyline.getSegments().push(1);
                }
                else {
                    polyline.getSegments().push(2);
                }
            }    
        }
    }
 
    polyline.setLayer('0');//将线设置在下层,点设置在上层“top”
    dm.add(polyline);//将管线添加进数据容器中储存,不然这个管线属于“游离”状态,是不会显示在拓扑图上的
    return polyline;
}

地点代码中丰裕大巴线上的点有分为两种情况,是因为 js 中设置线的时候 Line68 有八个“跳跃”点的景观,所以我们必须“跳跃”过去,篇幅有限 Line68 数组具体的申明自行看 subway.js。

此间表明某个,要是用的是 addPoint 函数,不安装 segments 时,暗中同意将加多进的点用直线连接,segments 的概念如下:

  • 1: moveTo,占用 1 个点音讯,代表三个新路线的源点
  • 2: lineTo,占用 1 个点消息,代表从上次最后点连接到该点
  • 3: quadraticCurveTo,占用 2 个点音讯,第三个点作为曲线调节点,第三个点作为曲线停止点
  • 4: bezierCurveTo,占用 3 个点消息,第一和第三个点作为曲线调节点,第三个点作为曲线结束点
  • 5: closePath,不占用点新闻,代表此番路线绘制甘休,并关闭到路线的开端点

之所以大家要做“跳跃”的作为设置 segments 为 1 就可以。

末段绘制那么些大巴线上的点,这几个部分 subway.js 中也分离出来了,命名以“mark_Point”、“t_Point”以及“n_Point”开始,作者在头里 js 的显得部分有对那几个数组进行分解,大家动动中指划上去走访。

咱俩在那个点的职责增加 ht.Node 节点,当节点一加多进 dm 数据容器中时,就能在拓扑图上显得,当然,前提是那个拓扑图组件 gv 设置的数据容器是其一 dm。篇幅有限,加多地铁线上的点的代码部分本身只彰显丰裕“换乘站点”的点:

var tName = 't_Point' num; var tP = window[tName];//大站点 if(tP) {//有些线路未有“换乘站点” for(let i = 0; i < tP.length; i ) { let node = createNode(tP[i].name, tP[i].value, color[index]);//在猎取的路径上的点的坐标地点增加节点 node.s({//设置节点的样式style 'label.scale': 0.05,//文本缩放,可防止止浏览器限制的一点都不大字号难题 'label.font': 'bold 12px arial, sans-serif'//设置文本的font }); node.setSize(0.6, 0.6);//设置节点大小。由于js中每种点之间的偏移量太小,所以自己只可以把节点设置小部分 node.setImage('images/旋转箭头.json');//设置节点的图纸 node.a('alarmColor1', 'rgb(150, 150, 150)');//attr属性,能够在这里面安装任何的东西,alarmColor1是在上头安装的image的json中绑定的特性,具体参看 HT for Web 矢量手册() node.a('alarmColor2', 'rgb(150, 150, 150)');//同上 node.a('tpNode', true);//那些天性设置只是为了用来区分“换乘站点”和“小站点”的,后边会用上 } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var tName = 't_Point' num;
var tP = window[tName];//大站点
if(tP) {//有些线路没有“换乘站点”
    for(let i = 0; i < tP.length; i ) {
        let node = createNode(tP[i].name, tP[i].value, color[index]);//在获取的线路上的点的坐标位置添加节点
        node.s({//设置节点的样式style
            'label.scale': 0.05,//文本缩放,可以避免浏览器限制的最小字号问题
            'label.font': 'bold 12px arial, sans-serif'//设置文本的font
        });
        node.setSize(0.6, 0.6);//设置节点大小。由于js中每个点之间的偏移量太小,所以我不得不把节点设置小一些
        node.setImage('images/旋转箭头.json');//设置节点的图片
        node.a('alarmColor1', 'rgb(150, 150, 150)');//attr属性,可以在这里面设置任何的东西,alarmColor1是在上面设置的image的json中绑定的属性,具体参看 HT for Web 矢量手册(http://www.hightopo.com/guide/guide/core/vector/ht-vector-guide.html#ref_binding)
        node.a('alarmColor2', 'rgb(150, 150, 150)');//同上
        node.a('tpNode', true);//这个属性设置只是为了用来区分“换乘站点”和“小站点”的,后面会用上
    }
}

富有的大巴线路以及站点都抬高完结。但是!你可能会看不见本人绘制的图,因为她们太小了,这一年能够安装 graphView 拓扑组件上的 fitContent 函数,大家顺便将拓扑图上的持有东西不足移动也安装一下:

gv.fitContent(false, 0.00001);//自适应大小,参数1为是还是不是动画,参数2为gv与边框的padding值 gv.setMovableFunc(function(){ return false;//设置gv上的节点不可移动 });

1
2
3
4
gv.fitContent(false, 0.00001);//自适应大小,参数1为是否动画,参数2为gv与边框的padding值
gv.setMovableFunc(function(){
    return false;//设置gv上的节点不可移动
});

那下你的地铁线路图就能够展现啦~接下来看看相互。

form 表单增加行是通过 addRow 函数,大家任重(英文名:rèn zhòng)而道远来讲一下底下的几行,Color、Range 和 Intensity,那三个名字根本是用来支配“头灯”的。在 HT 中一贯通过 setHeadlightColor/setHeadlightRange/setHeadlightIntensity 几个函数来决定“头灯”的水彩、范围以及灯的强度,onValueChanged 属性,看名就能够猜到其意义属性值更改之后触发的事件:

如此的组织有个好处就多少我是带档期的顺序的,非常方便遍历,在前面包车型大巴级联关联合中学会看到
3: 面子做好了这就起来做里子了,编写脚本(Javascript)
本人是JQuery得拥护者,所以自然js的框架自然是运用Jquery了
先上个一体化代码,再逐条分析

难忘,form 表单要安装宽高,不然不突显。

那我要制作的TreeView正是为了兑现这几个5个关键指标的。

接着成立弹力球,简单生成一个3D 节点,通过设置那么些节点的 style 样式属性来决定节点的突显情势,其少将“shape3d”设置为“sphere”就能够将 ht.Node 六面体变成 3D 球人体模型型,再设置“shape3d”属性为日前定义的随便颜色,s3 是 HT 封装的装置 3D 节点大小的 setSize3d 函数的简写,最终将那一个节点增添进数据模型 dataModel 中:

异步加载,按需加载的动静也是十三分常用的,使用的是SQL Azure服务器在美利坚联邦合众国ing,所以恐怕异步有一点慢,本地数据源那是一下子的

分分快三计划 7

.ie .bbit-tree .bbit-tree-bwrap{
}
.bbit-tree ul,.bbit-tree li
{
list-style-type:none;
margin:0px;
padding:0px;
}
.bbit-tree-body
{
font-size:12px;
}
.bbit-tree-icon, .bbit-tree-ec-icon, .bbit-tree-node-cb,.bbit-tree-elbow-line, .bbit-tree-elbow, .bbit-tree-elbow-end, .bbit-tree-elbow-plus, .bbit-tree-elbow-minus, .bbit-tree-elbow-end-plus, .bbit-tree-elbow-end-minus{
border: 0 none;
height: 18px;
margin: 0;
padding: 0;
vertical-align: top;
width: 16px;
background-repeat: no-repeat;
}
.bbit-tree-node-cb
{
height:16px;
}
.bbit-tree-node-collapsed .bbit-tree-node-icon, .bbit-tree-node-expanded .bbit-tree-node-icon, .bbit-tree-node-leaf .bbit-tree-node-icon{
border: 0 none;
height: 18px;
margin: 0;
padding: 0;
vertical-align: top;
width: 16px;
background-position:center;
background-repeat: no-repeat;
}
.ie .bbit-tree-node-indent img, .ie .bbit-tree-node-icon, .ie .bbit-tree-ec-icon {
vertical-align:middle !important;
}
.bbit-tree-noicon .bbit-tree-node-icon{
width:0; height:0;
}
/* No line styles 没有线的样式 */
.bbit-tree-no-lines .bbit-tree-elbow{
background:transparent;
}
.bbit-tree-no-lines .bbit-tree-elbow-end{
background:transparent;
}
.bbit-tree-no-lines .bbit-tree-elbow-line{
background:transparent;
}
/* Arrows Vista系统树的体裁只有箭头*/
.bbit-tree-arrows .bbit-tree-elbow{
background:transparent;
}
.bbit-tree-arrows .bbit-tree-elbow-plus{
background:transparent no-repeat 0 0;
}
.bbit-tree-arrows .bbit-tree-elbow-minus{
background:transparent no-repeat -16px 0;
}
.bbit-tree-arrows .bbit-tree-elbow-end{
background:transparent;
}
.bbit-tree-arrows .bbit-tree-elbow-end-plus{
background:transparent no-repeat 0 0;
}
.bbit-tree-arrows .bbit-tree-elbow-end-minus{
background:transparent no-repeat -16px 0;
}
.bbit-tree-arrows .bbit-tree-elbow-line{
background:transparent;
}
.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-plus{
background-position:-32px 0;
}
.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-minus{
background-position:-48px 0;
}
.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-end-plus{
background-position:-32px 0;
}
.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-end-minus{
background-position:-48px 0;
}
.bbit-tree-elbow-plus, .bbit-tree-elbow-minus, .bbit-tree-elbow-end-plus, .bbit-tree-elbow-end-minus{
cursor:pointer;
}
.ie ul.bbit-tree-node-ct{
font-size:0;
line-height:0;
zoom:1;
}
.bbit-tree-node{
white-space: nowrap;
}
.bbit-tree-node-el {
line-height:18px;
cursor:default;
/* cursor:pointer;*/
}
.bbit-tree-node a{
text-decoration:none;
-khtml-user-select:none;
-moz-user-select:none;
-webkit-user-select:ignore;
-kthml-user-focus:normal;
-moz-user-focus:normal;
-moz-outline: 0 none;
outline:0 none;
}
.bbit-tree-node a span{
text-decoration:none;
padding:1px 3px 1px 2px;
}
.bbit-tree-node .bbit-tree-node-disabled .bbit-tree-node-icon{
-moz-opacity: 0.5;
opacity:.5;
filter: alpha(opacity=50);
}
.bbit-tree-node .bbit-tree-node-inline-icon{
background:transparent;
}
.bbit-tree-node a:hover{
text-decoration:none;
}

插:大家仍可以够在工业上用 HeatMap 热图上做小说,效果照旧很炫,具体地址http://hightopo.com/guide/guide/plugin/forcelayout/examples/example_heatmap3d.html

function check(item, state, type) {
var pstate = item.checkstate; //当前景况
if (type == 1) {
item.checkstate = state; //假如是遍历子节点,父是什么子正是什么
}
else {// 上溯 ,这些就头昏眼花一些了
var cs = item.ChildNodes; //获取当前节点的全体子节点
var l = cs.length;
var ch = true; //是或不是不是中间状态 半选
for (var i = 0; i < l; i ) {
if ((state == 1 && cs[i].checkstate != 1) || state == 0 && cs[i].checkstate != 0) {
ch = false;
break;//他的子节点只要有贰个没选中,那么他正是半选
}
}
if (ch) {
item.checkstate = state;//不是半选,则子节点是如何他就是怎么着
}
else {
item.checkstate = 2; //半选
}
}
//change show 假设节点已出口,而其前后状态分化,则变化checkbxo的突显
if (item.render && pstate != item.checkstate) {
var et = $("#" id "_" item.id "_cb");
if (et.length == 1) {
et.attr("src", dfop.cbiconpath dfop.icons[item.checkstate]);
}
}
}

HT 将顾客自定义的质量和 HT 默许的性质调用方法分为 node.a 和 node.s 那样就会将两侧有效地区分开来(具体参照 HT for Web 入门手册 style 章节),我们在开创管线的时候就用了这种办法:

根据笔者的体系实市价况,首借使多少个关键点:

['Color', 'Range', 'Intensity'].forEach(function(name) {
    var obj = { id: name },
    func = function(oV, nV) {
        g3d['setHeadlight'   name](nV);// === g3d.setHeadlightColor(nV)/g3d.setHeadlightRange(nV)/g3d.setHeadlightIntensity(nV)
    };
    if (name === 'Color')
        obj.colorPicker = {//ht.widget.ColorPicker为颜色选择框 
        instant: true,
        value: g3d['getHeadlight'   name](),// === g3d.getHeadlightColor()
        onValueChanged: func
    };
    else 
        obj.slider = {//滑动条
            min: 0,
        max: name === 'Range' ? 20000 : 3,
        step: 0.1,
        value: g3d['getHeadlight'   name](),
        onValueChanged: func
        };
    formPane.addRow([ name, obj ], [ 70, 0.1 ]);
});

先来看下效果图

最神秘的是如何能做出让七个节点“若即若离”的法力?

其三步:生成默许数据的HTML(依据大家的解析节点的Dom结构,数据的数据结构,生成节点那是非常的简约),,增加到日前容器中。最后是注册事件这里有贰个不胜重大的地点,即懒加载(未有展开的节点HTML是不成形的),这将须要我们在树内部要爱抚一套数据(成本相当的小),对于质量的升官那是一对一的刚烈。其余三个重中之重的地点,正是接纳一遍变动全数开展节点的HTML并通过innerHTML属性来生成Dom,实际不是经过append操作,因为一贯操作innerHTML比通过dom原生的不二等秘书秘籍快上N倍(节点更加的多,N越大),切记切记!

var createMatrix = function(p1, p2, width) {//createMatrix(array, matrix)将一组JSON描述的缩放、移动和旋转等操作转换成对应的变化矩阵
    var vec = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]],
        dist = ht.Default.getDistance(p1, p2);//获取两点之间距离,或向量长度
    return ht.Default.createMatrix({
        s3: [width, dist, width],
    r3: [Math.PI/2 - Math.asin(vec[1]/dist), Math.atan2(vec[0], vec[2]), 0],
    rotationMode: 'xyz',
    t3: [(p1[0] p2[0])/2, (p1[1] p2[1])/2, (p1[2] p2[2])/2]
    });
};

而我动用的也是第三种方式,可是缩进选择了增加补充的艺术,即缩进的职位用空白的图形填充来制止Jquery.treeview的难点

ht.Default.setShape3dModel(//创建模型 根据xy平面的曲线,环绕一周形成3D模型。
    'custom', ht.Default.createRingModel( [0.5, 0.5, -0.2, 0, 0.5, -0.5], [1, 3] )
);

复制代码 代码如下:

利用弹力布局功用需求在引入ht.js`核心库之后,再引入一个ht-forcelayout.js `的弹力布局插件库,因为还用到了 form 表单,所以要引入 ht-form.js 的表单插件库:

1:帮衬静态的树,即一遍性将总体数量加载到顾客端。 2:异步树,即贰遍只加载顶尖或若干...

分分快三计划 8

分分快三计划 9 IE8下开展到第5级

var updatePipeline = function(edge) {//重新设置edge的样式
    var pipeline = edge.a('pipeline');
    pipeline.s3(1, 1, 1);//设置大小
    pipeline.p3(0, 0, 0);//设置坐标

    var node1 = edge.getSourceAgent(),//获取图形上连接的起始节点
    node2 = edge.getTargetAgent();//获取图形上连接的目标节点
    pipeline.s('mat', createMatrix(node1.p3(), node2.p3(), 20));//3d整体图形矩阵变化
};

/* Fix for ie rootVisible:false issue,改良一个IEdebug */
.bbit-tree-root {
zoom:1;
}

前日效果图上冒出的还会有各样弹力球之间的连线,那个连线大家一看就感到很不一般,也是透过结构一个二个节点,这么些节点是因此 HT for Web 建模手册 setShape3dModel函数自定义的 ht.Default.createRingModel 依照 xy 平面的曲线,环绕十四日产生的 3D 环形模型,将其命名字为‘custom’:

分分快三计划 10 那正是那些 号带line的体制

基本功配件全体概念实现,接着就是将“shape3d”属性设置为自定义的 3D 模型“custom” ,并将“layoutable”属性设置为“false”阻止图元加入布局,并将点时期的连线通过edge.a('pipeline', node)重新刷新,并加多进数据模型 dataModel 中:

2:明确数据结构

本例地址:

明显了节点的HTML大家就可以来写CSS了。有了职能图,有个节点结构接着就编写CSS了

ht.layout.Force3dLayout类提供 3D弹力布局,构造函数可传入 DataModel和 Graph3dView三种参数。 默许仅对未选中图元进行布局,如若构造函数参数为 Graph3dView时,则视图组件的 isMovable和 isVisible函数将震慑图元是还是不是可布局, 图元 style上的 layoutable品质也可设为 false阻碍图元参预布局。

开展节点,异步乞求的片段代码应该不是很复杂就不细诉了,关键来说一下级联
级联有七个难题要拍卖,第三个是遍历子节点,第贰个是上溯到祖节点,因为大家的数据结构那多少个操作都彰显特别轻巧

分子力(molecular force),又称分子间功用力、范得瓦耳斯力,是指成员间的彼此功能。当二分子相距较远时,首要显示为吸重力,这种力器重来源于二个分子被另三个分子随时间连忙调换的电偶极矩所极化而引起的相互成效;当二分子非常类似时,则排斥力成为首要的,那是出于各成员的外围电子云初步重叠而爆发的排挤成效。

  • 还会有一对是div套table的措施,CSDN的领航树便是这种,是种折中的方法(节点也不算太复杂,何况CSS也相比较好写),如下图所示
    分分快三计划 11

HT for Web提供了弹力布局(也堪当力导向布局)的功力,即基于节点之间存在互斥力,相互连接的节点间存在重力, 弹力布局运转一段时间后,全部拓扑互联网布局会稳步达到未有牢固的平衡处境。这些作用很有趣,昨日我们就将它的吸重力表现出来。

css中所用到的兼具图片

率先我们定义三个颜料数组变量,存款和储蓄各样弹力球的颜料,还定义了三个自由函数,用来生成数随机的数组中的颜色:

由来大家树的重头戏职能已经完全落到实处了。别的便是公开一些艺术等,大家可详细代码,示例中公然了多少个三个脚下相中的兼具节点,别的一个当下的节点。 

设若还应该有不懂的请咨询小编,只怕能够直接上 HT for Web 官方网址查阅手册。

var menudata = [{
id: "0.1",//唯一的ID即可
text: "Beyondbit UI Demo",
hasChildren: true,
isexpand: true,
complete: true,
ChildNodes: [{
id: "0.1.1",
text: "日期选拔",
hasChildren: true,
isexpand: false,
complete: true,
ChildNodes: [{
id: "0.1.1.1",
text: "控件演示",
value: "Testpages/datepickerDemo.htm",
hasChildren: false,
isexpand: false,
complete: true,
ChildNodes: null
},
...
]

 

那么大家要动工了;

var formPane = new ht.widget.FormPane();
formPane.setWidth(230);
formPane.setHeight(125);
formPane.addToDOM();

var dfop ={
method: "POST",//默许使用POST提交数据
datatype: "json",//数据类型是json
url: false,//异步央浼的url
cbiconpath: "/images/icons/",//checkbox icon的目录地点
icons: ["checkbox_0.gif", "checkbox_1.gif", "checkbox_2.gif"],//checkbxo三态的图样
showcheck: false, //是不是出示checkbox
oncheckboxclick: false, //点击checkbox时接触的平地风波
onnodeclick: false,//点击node触发的日子
cascadecheck: true,//是不是启用级联
data: null,//开端化数据
theme: "bbit-tree-arrows" //三种风格备选bbit-tree-lines ,bbit-tree-no-lines,bbit-tree-arrows
}
//用传进来的参数覆盖暗中认可,没传则保留
$.extend(dfop, settings);

界面上的图样全体制图完结,剩下的就唯有form 表单,首先将 form 表单增添进 HTML 页面,用的是 HT 封装的 ht.widget.FormPane 函数:

复制代码 代码如下:

var colorList = ['#FFAFA4', '#B887C5', '#B9EA9C', '#CFD9E7', '#4590B8', '#FF9C30'], 
    colorLen = colorList.length;
var randomColor = function() {
    var ran = Math.random() * colorLen;
    return colorList[Math.floor(ran)];//随机6种颜色
};

回答:

var createEdge = function(dm, node1, node2) {//创建‘custom’模型的edge
    var node = new ht.Node();
    node.s({
        'shape3d': 'custom',
        'shape3d.color': '#ECE0D4',
        'layoutable': false
    });
    dm.add(node);

    var edge = new ht.Edge(node1, node2);
    edge.a('pipeline', node);
    edge.s('edge.color', 'rgba(0, 0, 0, 0)');
    dm.add(edge);
    return edge;
};

 

 

;(function($) {
//也得以使用$.fn.extend(treeview:function(setting){})
$.fn.treeview = function(settings) {
}
})(jQuery);

介绍完 HT 封装的弹力布局的背景之后,接下去便是补助你们也能自在地落到实处那一个职能。

复制代码 代码如下:

找到节点的同期都会触发check那一个回调函数,来剖断当前节点的地方,详细请看下边代码中的注释部分应该是相比清晰,描写了这些进度

分分快三计划 12

在节点生成进程中,同期可生产节点的Path(节点路线),方便寻觅

分分快三计划 13 分分快三计划 14 分分快三计划 15 分分快三计划 16 分分快三计划 17 分分快三计划 18 分分快三计划 19 分分快三计划 20 分分快三计划 21 分分快三计划 22 分分快三计划 23 分分快三计划 24 分分快三计划 25 分分快三计划 26 分分快三计划 27 分分快三计划 28

 

1:支持静态的树,即一回性将总体数额加载到顾客端。
2:异步树,即壹遍只加载一流或若干级节点,子节点能够异步加载数据。
3:Checkbox树(也许是静态树也说不定是异步树),用于采纳(如选择组织机关,接纳数据字典项)等,最佳是能力所能达到扶助节点级联(这一个是难关)
4:能够传承大数据量,并品质表现优秀
5:能够在主流浏览器中运维优良

JQuery.treeview的节点结构

//遍历子节点
function cascade(fn, item, args) {
if (fn(item, args, 1) != false) {
if (item.ChildNodes != null && item.ChildNodes.length > 0) {
var cs = item.ChildNodes;
for (var i = 0, len = cs.length; i < len; i ) {
cascade(fn, cs[i], args);
}
}
}
}
//冒泡的祖先
function bubble(fn, item, args) {
var p = item.parent;
while (p) {
if (fn(p, args, 0) === false) {
break;
}
p = p.parent;
}
}

分分快三计划 29

那第二步:给控件加一些参数私下认可参数,相同的时候能调用方法$.extend让最终调用时的参数覆盖暗中认可的(若无则动用私下认可)

分分快三计划 30

复制代码 代码如下:

/***********这里是Logo了,能够在那边替换哦*****************/
.bbit-tree-node-expanded .bbit-tree-node-icon{
background-image:url(images/tree/folder-open.gif);
}
.bbit-tree-node-leaf .bbit-tree-node-icon{
background-image:url(images/tree/leaf.gif);
}
.bbit-tree-node-collapsed .bbit-tree-node-icon{
background-image:url(images/tree/folder.gif);
}
.bbit-tree-node-loading .bbit-tree-node-icon{
background-image:url(images/tree/loading.gif) !important;
}
.bbit-tree-node .bbit-tree-node-inline-icon {
background-image: none;
}
.bbit-tree-node-loading a span{
font-style: italic;
color:#444444;
}
.bbit-tree-lines .bbit-tree-elbow{
background-image:url(images/tree/elbow.gif);
}
.bbit-tree-lines .bbit-tree-elbow-plus{
background-image:url(images/tree/elbow-plus.gif);
}
.bbit-tree-lines .bbit-tree-elbow-minus{
background-image:url(images/tree/elbow-minus.gif);
}
.bbit-tree-lines .bbit-tree-elbow-end{
background-image:url(images/tree/elbow-end.gif);
}
.bbit-tree-lines .bbit-tree-elbow-end-plus{
background-image:url(images/tree/elbow-end-plus.gif);
}
.bbit-tree-lines .bbit-tree-elbow-end-minus{
background-image:url(images/tree/elbow-end-minus.gif);
}
.bbit-tree-lines .bbit-tree-elbow-line{
background-image:url(images/tree/elbow-line.gif);
}
.bbit-tree-no-lines .bbit-tree-elbow-plus{
background-image:url(images/tree/elbow-plus-nl.gif);
}
.bbit-tree-no-lines .bbit-tree-elbow-minus{
background-image:url(images/tree/elbow-minus-nl.gif);
}
.bbit-tree-no-lines .bbit-tree-elbow-end-plus{
background-image:url(images/tree/elbow-end-plus-nl.gif);
}
.bbit-tree-no-lines .bbit-tree-elbow-end-minus{
background-image:url(images/tree/elbow-end-minus-nl.gif);
}
.bbit-tree-arrows .bbit-tree-elbow-plus{
background-image:url(images/tree/arrows.gif);
}
.bbit-tree-arrows .bbit-tree-elbow-minus{
background-image:url(images/tree/arrows.gif);
}
.bbit-tree-arrows .bbit-tree-elbow-end-plus{
background-image:url(images/tree/arrows.gif);
}
.bbit-tree-arrows .bbit-tree-elbow-end-minus{
background-image:url(images/tree/arrows.gif);
}
/*TreeNode 选中的Disabled的有的颜料,字体样式*/
.bbit-tree-node{
color:#000;
font: normal 11px arial, tahoma, helvetica, sans-serif;
}
.bbit-tree-node a{
color:#000;
}
.bbit-tree-node a span{
color:#000;
}
.bbit-tree-node .bbit-tree-node-disabled a span{
color:gray !important;
}
.bbit-tree-node .bbit-tree-node-over {
background-color: #eee;
}
.bbit-tree-node .bbit-tree-selected {
background-color: #d9e8fb;
}

/****************************************
author:[email protected]
page:
***************************************/
(function($) {
$.fn.swapClass = function(c1, c2) {
return this.removeClass(c1).addClass(c2);
}
$.fn.switchClass = function(c1, c2) {
if (this.hasClass(c1)) {
return this.swapClass(c1, c2);
}
else {
return this.swapClass(c2, c1);
}
}
$.fn.treeview = function(settings) {
var dfop =
{
method: "POST",
datatype: "json",
url: false,
cbiconpath: "/images/icons/",
icons: ["checkbox_0.gif", "checkbox_1.gif", "checkbox_2.gif"],
showcheck: false, //是不是出示接纳
oncheckboxclick: false, //当checkstate状态变化时所接触的平地风波,不过不会触发因级联选择而孳生的退换
onnodeclick: false,
cascadecheck: true,
data: null,
clicktoggle: true, //点击节点实行和减少子节点
theme: "bbit-tree-arrows" //bbit-tree-lines ,bbit-tree-no-lines,bbit-tree-arrows
}
$.extend(dfop, settings);
var treenodes = dfop.data;
var me = $(this);
var id = me.attr("id");
if (id == null || id == "") {
id = "bbtree" new Date().getTime();
me.attr("id", id);
}
var html = [];
buildtree(dfop.data, html);
me.addClass("bbit-tree").html(html.join(""));
InitEvent(me);
html = null;
//预加载图片
if (dfop.showcheck) {
for (var i = 0; i < 3; i ) {
var im = new Image(16,16);
im.src = dfop.cbiconpath dfop.icons[i];
}
}
//region
function buildtree(data, ht) {
ht.push("<div class='bbit-tree-bwrap'>"); // Wrap ;
ht.push("<div class='bbit-tree-body'>"); // body ;
ht.push("<ul class='bbit-tree-root ", dfop.theme, "'>"); //root
var l = data.length;
for (var i = 0; i < l; i ) {
buildnode(data[i], ht, 0, i, i == l - 1);
}
ht.push("</ul>"); // root and;
ht.push("</div>"); // body end;
ht.push("</div>"); // Wrap end;
}
//endregion
function buildnode(nd, ht, deep, path, isend) {
ht.push("<li class='bbit-tree-node'>");
ht.push("<div id='", id, "_", nd.id, "' tpath='", path, "' unselectable='on'");
var cs = [];
cs.push("bbit-tree-node-el");
if (nd.hasChildren) {
cs.push(nd.isexpand ? "bbit-tree-node-expanded" : "bbit-tree-node-collapsed");
}
else {
cs.push("bbit-tree-node-leaf");
}
if (nd.classes) { cs.push(nd.classes); }
ht.push(" class='", cs.join(" "), "'>");
//span indent
ht.push("<span class='bbit-tree-node-indent'>");
if (deep == 1) {
ht.push("<img class='bbit-tree-icon' src='../Themes/Shared/images/s.gif'/>");
}
else if (deep > 1) {
ht.push("<img class='bbit-tree-icon' src='../Themes/Shared/images/s.gif'/>");
for (var j = 1; j < deep; j ) {
ht.push("<img class='bbit-tree-elbow-line' src='../Themes/Shared/images/s.gif'/>");
}
}
ht.push("</span>");
//img
cs.length = 0;
if (nd.hasChildren) {
if (nd.isexpand) {
cs.push(isend ? "bbit-tree-elbow-end-minus" : "bbit-tree-elbow-minus");
}
else {
cs.push(isend ? "bbit-tree-elbow-end-plus" : "bbit-tree-elbow-plus");
}
}
else {
cs.push(isend ? "bbit-tree-elbow-end" : "bbit-tree-elbow");
}
ht.push("<img class='bbit-tree-ec-icon ", cs.join(" "), "' src='../Themes/Shared/images/s.gif'/>");
ht.push("<img class='bbit-tree-node-icon' src='../Themes/Shared/images/s.gif'/>");
//checkbox
if (dfop.showcheck && nd.showcheck) {
if (nd.checkstate == null || nd.checkstate == undefined) {
nd.checkstate = 0;
}
ht.push("<img id='", id, "_", nd.id, "_cb' class='bbit-tree-node-cb' src='", dfop.cbiconpath, dfop.icons[nd.checkstate], "'/>");
}
//a
ht.push("<a hideFocus class='bbit-tree-node-anchor' tabIndex=1 href='javascript:void(0);'>");
ht.push("<span unselectable='on'>", nd.text, "</span>");
ht.push("</a>");
ht.push("</div>");
//Child
if (nd.hasChildren) {
if (nd.isexpand) {
ht.push("<ul class='bbit-tree-node-ct' style='z-index: 0; position: static; visibility: visible; top: auto; left: auto;'>");
if (nd.ChildNodes) {
var l = nd.ChildNodes.length;
for (var k = 0; k < l; k ) {
nd.ChildNodes[k].parent = nd;
buildnode(nd.ChildNodes[k], ht, deep 1, path "." k, k == l - 1);
}
}
ht.push("</ul>");
}
else {
ht.push("<ul style='display:none;'></ul>");
}
}
ht.push("</li>");
nd.render = true;
}
function getItem(path) {
var ap = path.split(".");
var t = treenodes;
for (var i = 0; i < ap.length; i ) {
if (i == 0) {
t = t[ap[i]];
}
else {
t = t.ChildNodes[ap[i]];
}
}
return t;
}
function check(item, state, type) {
var pstate = item.checkstate;
if (type == 1) {
item.checkstate = state;
}
else {// 上溯
var cs = item.ChildNodes;
var l = cs.length;
var ch = true;
for (var i = 0; i < l; i ) {
if ((state == 1 && cs[i].checkstate != 1) || state == 0 && cs[i].checkstate != 0) {
ch = false;
break;
}
}
if (ch) {
item.checkstate = state;
}
else {
item.checkstate = 2;
}
}
//change show
if (item.render && pstate != item.checkstate) {
var et = $("#" id "_" item.id "_cb");
if (et.length == 1) {
et.attr("src", dfop.cbiconpath dfop.icons[item.checkstate]);
}
}
}
//遍历子节点
function cascade(fn, item, args) {
if (fn(item, args, 1) != false) {
if (item.ChildNodes != null && item.ChildNodes.length > 0) {
var cs = item.ChildNodes;
for (var i = 0, len = cs.length; i < len; i ) {
cascade(fn, cs[i], args);
}
}
}
}
//冒泡的祖宗
function bubble(fn, item, args) {
var p = item.parent;
while (p) {
if (fn(p, args, 0) === false) {
break;
}
p = p.parent;
}
}
function nodeclick(e) {
var path = $(this).attr("tpath");
var et = e.target || e.srcElement;
var item = getItem(path);
//debugger;
if (et.tagName == "IMG") {
// 号必要开展
if ($(et).hasClass("bbit-tree-elbow-plus") || $(et).hasClass("bbit-tree-elbow-end-plus")) {
var ul = $(this).next(); //"bbit-tree-node-ct"
if (ul.hasClass("bbit-tree-node-ct")) {
ul.show();
}
else {
var deep = path.split(".").length;
if (item.complete) {
item.ChildNodes != null && asnybuild(item.ChildNodes, deep, path, ul, item);
}
else {
$(this).addClass("bbit-tree-node-loading");
asnyloadc(ul, item, function(data) {
item.complete = true;
item.ChildNodes = data;
asnybuild(data, deep, path, ul, item);
});
}
}
if ($(et).hasClass("bbit-tree-elbow-plus")) {
$(et).swapClass("bbit-tree-elbow-plus", "bbit-tree-elbow-minus");
}
else {
$(et).swapClass("bbit-tree-elbow-end-plus", "bbit-tree-elbow-end-minus");
}
$(this).swapClass("bbit-tree-node-collapsed", "bbit-tree-node-expanded");
}
else if ($(et).hasClass("bbit-tree-elbow-minus") || $(et).hasClass("bbit-tree-elbow-end-minus")) { //- 号供给裁减
$(this).next().hide();
if ($(et).hasClass("bbit-tree-elbow-minus")) {
$(et).swapClass("bbit-tree-elbow-minus", "bbit-tree-elbow-plus");
}
else {
$(et).swapClass("bbit-tree-elbow-end-minus", "bbit-tree-elbow-end-plus");
}
$(this).swapClass("bbit-tree-node-expanded", "bbit-tree-node-collapsed");
}
else if ($(et).hasClass("bbit-tree-node-cb")) // 点击了Checkbox
{
var s = item.checkstate != 1 ? 1 : 0;
var r = true;
if (dfop.oncheckboxclick) {
r = dfop.oncheckboxclick.call(et, item, s);
}
if (r != false) {
if (dfop.cascadecheck) {
//遍历
cascade(check, item, s);
//上溯
bubble(check, item, s);
}
else {
check(item, s, 1);
}
}
}
}
else {
if (dfop.citem) {
$("#" id "_" dfop.citem.id).removeClass("bbit-tree-selected");
}
dfop.citem = item;
$(this).addClass("bbit-tree-selected");
if (dfop.onnodeclick) {
dfop.onnodeclick.call(this, item);
}
}
}
function asnybuild(nodes, deep, path, ul, pnode) {
var l = nodes.length;
if (l > 0) {
var ht = [];
for (var i = 0; i < l; i ) {
nodes[i].parent = pnode;
buildnode(nodes[i], ht, deep, path "." i, i == l - 1);
}
ul.html(ht.join(""));
ht = null;
InitEvent(ul);
}
ul.addClass("bbit-tree-node-ct").css({ "z-index": 0, position: "static", visibility: "visible", top: "auto", left: "auto", display: "" });
ul.prev().removeClass("bbit-tree-node-loading");
}
function asnyloadc(pul, pnode, callback) {
if (dfop.url) {
var param = builparam(pnode);
$.ajax({
type: dfop.method,
url: dfop.url,
data: param,
dataType: dfop.datatype,
success: callback,
error: function(e) { alert("error occur!"); }
});
}
}
function builparam(node) {
var p = [{ name: "id", value: encodeURIComponent(node.id) }
, { name: "text", value: encodeURIComponent(node.text) }
, { name: "value", value: encodeURIComponent(node.value) }
, { name: "checkstate", value: node.checkstate}];
return p;
}
function InitEvent(parent) {
var nodes = $("li.bbit-tree-node>div", parent);
nodes.each(function(e) {
$(this).hover(function() {
$(this).addClass("bbit-tree-node-over");
}, function() {
$(this).removeClass("bbit-tree-node-over");
})
.click(nodeclick)
.find("img.bbit-tree-ec-icon").each(function(e) {
if (!$(this).hasClass("bbit-tree-elbow")) {
$(this).hover(function() {
$(this).parent().addClass("bbit-tree-ec-over");
}, function() {
$(this).parent().removeClass("bbit-tree-ec-over");
});
}
});
});
}
function getck(items, c, fn) {
for (var i = 0, l = items.length; i < l; i ) {
items[i].checkstate == 1 && c.push(fn(items[i]));
if (items[i].ChildNodes != null && items[i].ChildNodes.length > 0) {
getck(items[i].ChildNodes, c, fn);
}
}
}
me[0].t = {
getSelectedNodes: function() {
var s = [];
getck(treenodes, s, function(item) { return item });
return s;
},
getSelectedValues: function() {
var s = [];
getck(treenodes, s, function(item) { return item.value });
return s;
},
getCurrentItem: function() {
return dfop.citem;
}
};
return me;
}
//获取具备入选的节点的Value数组
$.fn.getTSVs = function() {
if (this[0].t) {
return this[0].t.getSelectedValues();
}
return null;
}
//获取具备入选的节点的Item数组
$.fn.getTSNs = function() {
if (this[0].t) {
return this[0].t.getSelectedNodes();
}
return null;
}
$.fn.getTCT = function() {
if (this[0].t) {
return this[0].t.getCurrentItem();
}
return null;
}
})(jQuery);

说起底来看下效果啊?

自己的树节点结构

  

登记事件,接受参数parent,即从某一父节点起首增大事件(因为做了个hover效果,所以事件是在各种节点上,假诺撤除该意义,事件可直接附加Tree上通过伊芙nt的srcElement来散发可略提高质量)

大家能够经过以下网站查看文中的以身作则,selected拼错了,大家海涵! windows azure安顿依然麻烦懒得修改了3500 节点一遍加载,我们能够点击根节点的全选来拜访速度

1:第几个规定的节点Dom结构(即用什么的HTML来营造节点)

 

复制代码 代码如下:

function nodeclick(e) {
var path = $(this).attr("tpath");//获取节点路线
var et = e.target || e.srcElement;//获取事件源
var item = getItem(path);//依照path获取节点的数额
//debugger;
if (et.tagName == "IMG") {
// 号要求打开,管理加减号
if ($(et).hasClass("bbit-tree-elbow-plus") || $(et).hasClass("bbit-tree-elbow-end-plus")) {
var ul = $(this).next(); //"bbit-tree-node-ct"
if (ul.hasClass("bbit-tree-node-ct")) {
ul.show();
}
else {
var deep = path.split(".").length;
if (item.complete) {
item.ChildNodes != null && asnybuild(item.ChildNodes, deep, path, ul, item);
}
else {
$(this).addClass("bbit-tree-node-loading");
asnyloadc(ul, item, function(data) {
item.complete = true;
item.ChildNodes = data;
asnybuild(data, deep, path, ul, item);
});
}
}
if ($(et).hasClass("bbit-tree-elbow-plus")) {
$(et).swapClass("bbit-tree-elbow-plus", "bbit-tree-elbow-minus");
}
else {
$(et).swapClass("bbit-tree-elbow-end-plus", "bbit-tree-elbow-end-minus");
}
$(this).swapClass("bbit-tree-node-collapsed", "bbit-tree-node-expanded");
}
else if ($(et).hasClass("bbit-tree-elbow-minus") || $(et).hasClass("bbit-tree-elbow-end-minus")) { //- 号须求减少
$(this).next().hide();
if ($(et).hasClass("bbit-tree-elbow-minus")) {
$(et).swapClass("bbit-tree-elbow-minus", "bbit-tree-elbow-plus");
}
else {
$(et).swapClass("bbit-tree-elbow-end-minus", "bbit-tree-elbow-end-plus");
}
$(this).swapClass("bbit-tree-node-expanded", "bbit-tree-node-collapsed");
}
else if ($(et).hasClass("bbit-tree-node-cb")) // 点击了Checkbox
{
var s = item.checkstate != 1 ? 1 : 0;
var r = true;
if (dfop.oncheckboxclick) { //触发配置的函数
r = dfop.oncheckboxclick.call(et, item, s);
}
if (r != false) {//如若再次回到值不为false,即checkbxo变化使得
if (dfop.cascadecheck) {//允许触发级联
//遍历
cascade(check, item, s);//则向下关联
//上溯
bubble(check, item, s); //向上关联
}
else {
check(item, s, 1);//不然只管自身
}
}
}
}
else {//点击到了别样地方
if (dfop.citem) { //上一个脚下节点
$("#" id "_" dfop.citem.id).removeClass("bbit-tree-selected");
}
dfop.citem = item;//这一次的当前节点
$(this).addClass("bbit-tree-selected");
if (dfop.onnodeclick) {
dfop.onnodeclick.call(this, item);
}
}
}

1:如何设置每一个节点分化的图标?

那边最注重的依旧node的click事件,因为他要管理的政工相当多,如树的张开收缩(即便实节点不设有,不过hasChildren为真,同一时间complete属性不为真则供给异步加载子节点,如子节点存在,可是从未Render那么就要Render),点击checkbox要出发级联的事件和oncheckbox事件,点击任何则触发配置标准化的nodeonclick事件,这一体都因而前边event的源元素的class来区分点击的对象

FAQ:

复制代码 代码如下:

实际毫不扩展,本身就帮衬,只是未有申明而已,大家来看一下以此代码吧?在BuildNode方法中有那般一句?      
if (nd.classes) { cs.push(nd.classes); }

分分快三计划 31

上海体育场所是中华行政区域的数据树,总共得节点是3500 。

复制代码 代码如下:

分分快三计划 32

复制代码 代码如下:

然后便是编制八个Style 就可以

var treenodes = dfop.data; //内部的数目,其实平素用 dfop.data也足以
var me = $(this);
var id = me.attr("id");
if (id == null || id == "") {
id = "bbtree" new Date().getTime();
me.attr("id", id);
}//全局独一的ID
var html = [];
buildtree(dfop.data, html);//生成进行节点的HTML,push到数组中
me.addClass("bbit-tree").html(html.join(""));
InitEvent(me);//初始化事件
html = null;

分分快三计划 33 分分快三计划 34 分分快三计划 35

在节点的数据结构中可以安装属性classes ,该属性将用作节点特殊的Css Class 增多到节点上。那么利用这一点,就能够安装节点的Logo了

分分快三计划 36

复制代码 代码如下:

复制代码 代码如下:

if (nd.hasChildren) { //存在子节点
if (nd.isexpand) {//同一时间节点已经扩充则输出子节点
ht.push("<ul class='bbit-tree-node-ct' style='z-index: 0; position: static; visibility: visible; top: auto; left: auto;'>");
if (nd.ChildNodes) {
var l = nd.ChildNodes.length;
for (var k = 0; k < l; k ) {//递归调用并生育节点的路径
nd.ChildNodes[k].parent = nd;
buildnode(nd.ChildNodes[k], ht, deep 1, path "." k, k == l - 1);
}
}
ht.push("</ul>");
}
else { //不然是待输出状态
ht.push("<ul style='display:none;'></ul>");
}
}

Jquery.TreeView  IE6 下 张开第三级即现身错位

function InitEvent(parent) {
var nodes = $("li.bbit-tree-node>div", parent);
nodes.each(function(e) {
$(this).hover(function() {
$(this).addClass("bbit-tree-node-over"); //鼠标浮动节点的体裁变化
}, function() {
$(this).removeClass("bbit-tree-node-over");
})
.click(nodeclick)//node的onclick事件,那么些是主要哦
.find("img.bbit-tree-ec-icon").each(function(e) { //arrow的hover事件,为了贯彻vista那么些风格的
if (!$(this).hasClass("bbit-tree-elbow")) {
$(this).hover(function() {
$(this).parent().addClass("bbit-tree-ec-over");
}, function() {
$(this).parent().removeClass("bbit-tree-ec-over");
});
}
});
});
}

第一步:自然是持有Jquery的控件的率先步都以搭这么些架子,包容JQuery和$幸免闭包,制止和其他类库争论,接受叁个参数(是个目的)

上边是CSS的完全代码

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 HTML5 web前端 hightopo