当前位置:17727 > web前端信息 > 表单列表及预览和删除,打造基于jQuery的高性能

表单列表及预览和删除,打造基于jQuery的高性能

文章作者:web前端信息 上传时间:2019-11-29

效果图

17727.com 1

地图微微内容有一些多,要全体来得,字显得有一些小了,然而不妨,能够遵循要求加大减少,字体和制图的内容并不会失真,终究都以用矢量绘制的~

介绍完 HT 封装的弹力结构的背景之后,接下去就是扶助你们也能自在地促成那些效果。

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");
});
}
});
});
}

[html] view plain copy

依据 HTML5 Canvas 的人机联作式大巴线路图

2018/03/14 · HTML5 · Canvas

初藳出处: xhload3d   

 前言

前两日在 echarts 上查找灵感的时候,看见了累累有关地图相同的例子,地图定位等等,可是好像就是从未大巴线路图,就融洽花了黄金年代部分年华捣鼓出来了这厮机联作式大巴线路图的 德姆o,大巴线路上的点是在英特网随意下载了叁个,那篇文章记录自个儿的片段获取(毕竟笔者还是个新手)以至代码的兑现,希望能够帮到一些相恋的人。当然,要是有哪些观念的能够平素跟笔者说,大家合作交换才会提高。

插:大家还是能够在工业上用 HeatMap 热图上做文章,效果还是很炫,具体地址http://hightopo.com/guide/guide/plugin/forcelayout/examples/example_heatmap3d.html

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卡塔尔(英语:State of Qatar);//开始化事件
html = null;

自定义表单创造成功,要获得activiti中使用,自然须要让创造activiti流程的人能够看到毕竟有那些表单可用,各表单的效率是何许,由此就要求三个来得页面并提供预览功用。同一时间,增删改查四大效果是底子,自然都以内需的,作者那边未有做表单改过,只轻松的得以达成了删除。

界目生成

底层的 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(卡塔尔(英语:State of Qatar); }, 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'卡塔尔(英语:State of Qatar)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//设置选中节点的边框颜色 }卡塔尔(英语:State of Qatar); } 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卡塔尔(英语:State of Qatar){ polyline.setSegments([1]卡塔尔(英语:State of Qatar); } else if(i === 1 && j === 0卡塔尔(قطر‎ { polyline.getSegments(卡塔尔国.push(1卡塔尔(قطر‎; } else { polyline.getSegments(卡塔尔(قطر‎.push(2卡塔尔(英语:State of Qatar); } } } } polyline.setLayer('0'卡塔尔(英语:State of Qatar);//将线设置在下层,点设置在上层“top” dm.add(polyline卡塔尔(英语:State of Qatar);//将管线加多进数据容器中蕴藏,不然这几个管线归属“游离”状态,是不会突显在拓扑图上的 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。

这里说圣元(Karicare卡塔尔国些,如若用的是 addPoint 函数,不设置 segments 时,暗中认可将增多进的点用直线连接,segments 的定义如下:

  • 1: moveTo,占用 1 个点音讯,代表二个新路线的起源
  • 2: lineTo,占用 1 个点消息,代表从上次最终点连接到该点
  • 3: quadraticCurveTo,占用 2 个点音讯,第多少个点作为曲线调控点,第一个点作为曲线甘休点
  • 4: bezierCurveTo,占用 3 个点新闻,第生龙活虎和第1个点作为曲线调整点,第多少个点作为曲线截至点
  • 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卡塔尔(英语:State of Qatar);//设置节点大小。由于js中各类点时期的偏移量太小,所以本身必须要把节点设置小部分 node.setImage('images/旋转箭头.json'卡塔尔(英语:State of Qatar);//设置节点的图形 node.a('alarmColor1', 'rgb(150, 150, 150卡塔尔(英语:State of Qatar)'卡塔尔国;//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上的节点不可移动 }卡塔尔(英语:State of Qatar);

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

那下你的大巴线路图就能够突显啦~接下来看看相互。

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整体图形矩阵变化
};

17727.com 2

生龙活虎、 表单列表页面formList.html:

交互

第一是鼠标移动事件,鼠标滑过具体线路时,线路会变粗,悬停转眼间还是能看出那条路径的号码;当鼠标移动到“换乘站点”或“小站点”,站点对应的Logo都会变大何况变色,字体也会变大,鼠标移开Logo变回原本的颜色而且字体变小。分化点在于鼠标移动到“换乘站点”时,“换乘站点”会旋转。

17727.com 3

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

gv.getView(卡塔尔(英语:State of Qatar).add伊夫ntListener('mousemove', function(e卡塔尔 { var data = gv.getDataAt(e卡塔尔(قطر‎;//传入逻辑坐标点或然人机联作event事件参数,返回当前点下的图元 if(name卡塔尔(قطر‎ { originNode(name卡塔尔(英语:State of Qatar);//不管哪天都要让节点保持原本的大小 } if (data instanceof ht.Polyline卡塔尔(英语:State of Qatar) {//决断事件节点的档期的顺序dm.sm(卡塔尔(英语:State of Qatar).ss(data卡塔尔(英语:State of Qatar);//选中“管道” name = ''; clearInterval(interval卡塔尔(英语:State of Qatar); } else if (data instanceof ht.Node卡塔尔国 { if(data.getTag(卡塔尔 !== name && data.a('tpNode'卡塔尔(英语:State of Qatar)){//若不是同一个节点,並且mousemove的风云指标为ht.Node类型,那么设置节点的团团转 interval = setInterval(function(卡塔尔 { data.setRotation(data.getRotation(卡塔尔国

  • Math.PI/16卡塔尔(英语:State of Qatar); //在本人旋转的底子上再旋转 }, 100卡塔尔(قطر‎; } if(data.a('npNode'卡塔尔(قطر‎卡塔尔 {//假诺鼠标移到“小站点”也要停下动画clearInterval(interval卡塔尔; } expandNode(data, name卡塔尔(قطر‎;////自定义的拓展节点函数,比较简单,笔者不粘代码了,可以去 查看 dm.sm(卡塔尔.ss(data卡塔尔(قطر‎;//设置选中节点 name = data.getTag(卡塔尔(英语:State of Qatar);//作为“上二个节点”的仓库储存变量,可以由此那些值来获取节点 } else {//其余任何动静则不选中任何内容还要消灭“换乘站点”上的卡通 dm.sm(卡塔尔国.ss(null卡塔尔(英语:State of Qatar); 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 表单,单击表单上的维妙维肖路径,或然双击拓扑图上随便三个“站点”可能线路,则拓扑图会自适应到对应的局地,将被双击的片段展现到拓扑图的大旨。

17727.com 4

form 表单的宣示部分自个儿附近还从未解释。。。就是通过 new 贰个ht.widget.FomePane 类创立二个 form 表单组件,通过 form.getView()获取表单组件的最底层 div,将那个 div 摆放在 body 右下角,然后经过 addRow 函数向 form 表单中增多生机勃勃行的表单项,能够在此行中拉长大肆多个项,通过 addRow 函数的第叁个参数(贰个数组),对加多进的表单项进行大幅度的装置,通过第多个参数设置那行的万丈:

function createForm(卡塔尔 {//创设右下角的form表单 var form = new ht.widget.FormPane(卡塔尔国; form.setWidth(200卡塔尔;//设置表单宽度 form.setHeight(416卡塔尔(英语:State of Qatar);//设置表单高度 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卡塔尔(英语:State of Qatar) { form.addRow([//向表单中增添行 {//那风流洒脱行中的第四个表单项 button: {//向表单中增加button按钮 icon: 'images/Line'+nameString.value+'.json',//设置开关的Logo background: '',//设置按键的背景 borderColor: '',//设置开关的边框颜色 clickable: false//设置按键不可点击 } }, {//第2个表单项 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卡塔尔(英语:State of Qatar);//将入选的地铁线路彰显在拓扑图的中心 } } } ], [0.1, 0.2], 23卡塔尔(英语:State of Qatar);//第二个参数是安装第意气风发参数中的数组的肥瘦,小于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(卡塔尔(英语:State of Qatar);//创建一个新的节点,彰显为“红灯”的体制 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卡塔尔(英语:State of Qatar);//设置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 是我们客户来源定义的品质,平时是经过调用字符串来调用结果的,那个字符串对应的能够是常量也得以是函数,依旧很利索的。

最终还做了三个细微的片段,选中“站点”,则该“站点”的顶上部分会来得一个革命的会“呼吸”的用来申明当前相中的“站点”。

17727.com 5

“呼吸”的局地是应用 ht 的 setAnimation 函数来产生的,在用这几个函数从前要先开荒数据容器的卡通开关,然后设置动漫:

dm.enableAnimation(卡塔尔(英语:State of Qatar);//展开数据容器的卡通开关 function createRedLight(卡塔尔国{ var node = new ht.Node(卡塔尔国; node.setImage('images/红灯.json'卡塔尔(قطر‎;//设置节点的图纸 node.setSize(1, 1卡塔尔(英语:State of Qatar);//设置节点的分寸 node.setLayer('firstTop'卡塔尔国;//设置节点展现在gv的最上层 node.s('2d.visible', false卡塔尔(英语:State of Qatar);//节点不可以看到 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;
}

任何代码甘休!

切记,form 表单要设置宽高,不然不展现。

17727.com 6 17727.com 7 17727.com 8 17727.com 9 17727.com 10 17727.com 11 17727.com 12 17727.com 13 17727.com 14 17727.com 15 17727.com 16 17727.com 17 17727.com 18 17727.com 19 17727.com 20 17727.com 21

三、 后台代码:
Controller类中相关方法:

总结

以此 德姆o 花了自身二日时间成功,总感觉有一些不甘心啊,但是不常思维又转但是弯来,费用了超级多的时日,但是同理可得收获依旧广大的,笔者之前一直认为假设通过 getPoints(卡塔尔(英语:State of Qatar).push 来向多边形中增多点就足以了,求助了大神之后,发掘原先这一个主意不但绕弯路何况还有恐怕会师世各种各样标主题材料,比方getPoints 从前,应当要在绝大多数形中已经有 points 才方可,不过在数不完场合下,伊始化的 points 并倒霉设置,而且会招致代码很麻烦,直接通过 addPoint 方法,直接将点增多进多边形变量中,并且还有或然会私下认可将点通过直线的法子连接,也不用设置 segments,多喜人的二个函数。

再有就是因为 ht 暗中认可缩放大小是 20,而小编这么些 德姆o 的间隔又异常的小,引致缩放到最大大巴线路图突显也异常的小,所以自身在 htconfig 中退换了 ht 的暗中认可 zoomMax 属性,记住,改革那个值必需求在具有的 ht 调用早前,因为在 htconfig 中安装的值在末端定义都以不行退换的。

一句话来讲,这两日本人的脑部细胞死了大多,也再度生长了大多,人都以在不断升高的呗~

1 赞 1 收藏 评论

17727.com 22

<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>

那作者要塑造的TreeView正是为了完毕这些5个首要目标的。

自身下载的ueditor插件中有宗旨的创办和预览代码,因而小编就参照这么些重新修正,而后完结简单的抒发列表和预览、删除作用。

我们清楚,矩阵能描述肆意线性调换。线性别变化换保留了直线和平行线,线性别变化换保留直线的还要,其余的几何性质如长度、角度、面积和体量恐怕被改动改造了。同理可得,线性别变化换或者“拉伸”坐标系,但不会“屈曲”或“卷折”坐标系。这些函数首假诺将大家的连接线在拖动掸力球后被拖拖沓沓的连续几日线的开展贰个“变化矩阵”的操作,变化矩阵也是 HT 封装的 ht.Default.createMatrix 函数,通过将节点的 style 属性 mat 设置为贰个自定义的函数,正是将以此节点的坐标乘上在“mat”属性对应的值,也正是说假若当前这一个管线的旋转角为 [Math.PI/6, 0, 0],要是大家在 createMatrix 函数中设置 r3 为 [Math.PI/3, 0, 0],那么这几个节点会旋转 90 度。超级轻便地创造出调换矩阵:

下一场就是编辑一个Style 就可以

  1. @RequestMapping(value = "/findForms.do", method = RequestMethod.POST)  
  2.     @ResponseBody  
  3.     public Object findForms() {  
  4.         List<Map<String, String>> list = formService.findForms();  
  5.         return list;  
  6.     }  
  7.   
  8.   
  9.     @RequestMapping(value = "/deleteForm.do", method = RequestMethod.POST)  
  10.     @ResponseBody  
  11.     public Object deleteForm(HttpServletRequest request) {  
  12.         String formIde = request.getParameter("formId");  
  13.         formService.deleteForm(formIde);  
  14.         return null;  
  15.     }  

首先咱们定义叁个颜色数组变量,存款和储蓄各样弹力球的水彩,还定义了一个随机函数,用来生成数随机的数组中的颜色:

其三步:生成默许数据的HTML(根据大家的深入分析节点的Dom布局,数据的数据布局,生成节点那是老大的简要),,加多到当前容器中。最终是登记事件这里有二个要命关键的地点,即懒加载(未有实行的节点HTML是不扭转的卡塔尔,那将供给大家在树内部要爱戴生龙活虎套数据(费用超级小),对于质量的进步这是一定的名扬天下。其余贰个重要的地点,正是利用三回生成全数开展节点的HTML并经过innerHTML属性来生成Dom,并不是透过append操作,因为直接操作innerHTML比通过dom原生的诀要要快上N倍(节点更加多,N越大),切记切记!

  1.    <!DOCTYPE HTML>  
  2. <html>  
  3.  <head>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  6.     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">  
  7.     <script type="text/<a href="" class="replace_word" title="JavaScript知识库" target="_blank" style="color:#df3434; font-weight:bold;">javascript</a>" charset="utf-8" src="../js/<a href="" class="replace_word" title="jQuery知识库" target="_blank" style="color:#df3434; font-weight:bold;">jquery</a>-1.7.2.min.js?2023"></script>  
  8.     <link href="../my_css/a.css" rel="stylesheet" type="text/css" />  
  9.  </head>  
  10. <body style="margin:0">  
  11. <!-- fixed navbar -->  
  12. <!-- Docs page layout -->  
  13. <script type="text/javascript" charset="utf-8" src="../my_js/formList.js"></script>  
  14. <div style="width:100%;height:60px;background-color:#ccf;border:1px solid blue;text-decoration:none">  
  15.        
  16.      <img src="..tiviti.png" style="width:20%;height:98%;overflow:hidden;float:left"/>  
  17.        
  18.      <ul style="margin-left:30px;margin-top:10px; padding: 0px; font-size: 32px; width:60%;overflow:hidden;float:left">  
  19.         <li><a href="#" onclick="toAdd(卡塔尔(قطر‎;">新增添表单</a></li>  
  20.         <li> | </li>  
  21.         <li><a href="#" onclick="formList(卡塔尔国;">表单列表</a></li>  
  22.         <li> | </li>  
  23.         <li><a href="#" onclick="createModel(卡塔尔(英语:State of Qatar);">创造模型</a></li>  
  24.      </ul>  
  25. </div>  
  26. <div id="idv1" style="width:100%;position: absolute;height:auto">  
  27.    <div id="formDiv" style="width:88%;height:auto;position:relative;float:left;margin-left:10px;margin-top:10px;">  
  28.       <table id="ta1" style="width:100%;height:auto;text-align:center" border="1" cellpadding="0" cellspacing="0">  
  29.         <tr style="background-color:#ccc">  
  30.            <td style="width:100px;height:30px;font-size:25px">表单Id</td>  
  31.            <td style="width:100px;height:30px;font-size:25px">表单标题</td>  
  32.            <td style="font-size:25px">表单代码</td>  
  33.            <td style="width:100px;height:30px;font-size:25px">操作表单</td>  
  34.         </tr>  
  35.       </table>  
  36.    </div>  
  37. </div>  
  38.   
  39.   
  40. <div id="div2" style="top:100px;left:20%;width:60%;height:400px;position:absolute;background-color:grey;display:none;">  
  41.      
  42. </div>  
  43. </body>  
  44. </html>  

HT for Web提供了弹力布局(也可以称作力导向布局)的成效,即依照节点之间存在互斥力,相互连接的节点间存在重力, 弹力构造运维意气风发段时间后,全体拓扑网络构造会日趋达到未有稳固的平衡情状。这几个职能很有意思,明日我们就将它的魔力表现出来。

1:第多个规定的节点Dom结构(即用如何的HTML来营造节点)

[javascript] view plain copy

若果还会有不懂的请咨询作者,只怕能够直接上 HT for Web 官方网站查阅手册。

回答:

预览效果如图:

 

17727.com 23

 

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;
};

这么的构造有个平价就多少自个儿是带等级次序的,特别有利于遍历,在背后的级联关联合中学会看见
3: 面子做好了那就起来做里子了,编写脚本(Javascript)
自个儿是JQuery得拥护者,所以自然js的框架自然是应用Jquery了
先上个总体代码,再逐个深入分析

 

功底装配构件全体概念完毕,接着就是将“shape3d”属性设置为自定义的 3D 模型“custom” ,并将“layoutable”属性设置为“false”阻止图元参加构造,并将点时期的连线通过edge.a('pipeline', node卡塔尔(英语:State of Qatar)重新刷新,并加多进数据模型 dataModel 中:

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]);
}
}
}

17727.com 24

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

世家能够由此以下网站查看文中的演示,selected拼错了,大家海涵! windows azure布置依旧麻烦懒得纠正了3500+节点一回加载,大家能够点击根节点的全选来探视速度

 

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

而自身使用的也是第二种格局,不过缩进接纳了补充的法子,即缩进的职位用空白的图形填充来防止Jquery.treeview的主题素材

 17727.com 2517727.com 26

['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 ]);
});

上海教室是华夏行政区域的数据树,总共得节点是3500+。

 serviceImp实现:

方今效应图上边世的还应该有各类弹力球之间的连线,那个连线大家黄金时代看就感到特不日常,也是因而组织一个二个节点,这一个节点是通过 HT for Web 建立模型手册 setShape3dModel函数自定义的 ht.Default.createRingModel 依据 xy 平面包车型客车曲线,环绕13日变成的 3D 环形模型,将其取名称叫‘custom’:

17727.com 27 那正是十三分+号带line的样式

17727.com 28

17727.com 29

17727.com 30

列表页面效果如图:

form 表单加多行是透过 addRow 函数,大家最首要来讲一下底下的几行,Color、Range 和 Intensity,那八个名字根本是用来决定“头灯”的。在 HT 中一向通过 setHeadlightColor/setHeadlightRange/setHeadlightIntensity 四个函数来调整“头灯”的颜料、范围以至灯的强度,onValueChanged 属性,从名称想到所包含的意义属性值修正之后触发的风云:

JQuery.treeview的节点布局

  1. function toAdd(){  
  2.     window.location.href="../";   
  3. };  
  4. function formList(){  
  5.     window.location.href="./formList.html";   
  6. };  
  7. $(document).ready(function(){  
  8. $.ajax({  
  9.     type: 'POST',  
  10.     url : '/webFormTest/findForms.do',  
  11.     dataType : 'json',  
  12.     async:false,  
  13.     success : function(data){  
  14.         //alert("保存成功"卡塔尔国;  
  15.         console.log(data);  
  16.         for(var i=0;i<data.length;i++){  
  17.             var form=data[i];  
  18.             console.log(form);  
  19.                 var tables = document.getElementById("ta1");  
  20.                 var tr = document.createElement("tr");  
  21.                 var td0=document.createElement("td");  
  22.                 var td1=document.createElement("td");  
  23.                 var td2=document.createElement("td");  
  24.                 var td3=document.createElement("td");  
  25.                 td0.innerText=form.formId;  
  26.                 td1.innerText=form.formType;  
  27.                 td2.innerText=form.form;  
  28.                 td2.setAttribute("id",i);  
  29.                 var a1=document.createElement("a");  
  30.                 var node1 = document.createTextNode(" 删除  ");  
  31.                 a1.appendChild(node1);  
  32.                 a1.setAttribute("href","#");  
  33.                 a1.setAttribute("id","a1"+i);  
  34.                 a1.onclick=function(){  
  35.                     var id=this.id;  
  36.                     var id1=id.substring(2);  
  37.                     var formId=data[id1].formId;  
  38.                     //console.log(document.getElementById(id).innerText);   
  39.                     //console.log();  
  40.                     //先删除,后跳转  
  41.                     $.ajax({  
  42.                         type: 'POST',  
  43.                         url : '/webFormTest/deleteForm.do',  
  44.                         dataType : 'json',  
  45.                         async:false,  
  46.                         data:{"formId":formId},  
  47.                         success : function(){  
  48.                             window.location.href="./formList.html";  
  49.                         }      
  50.                     })  
  51.                 };  
  52.                   
  53.                 var a2=document.createElement("a");  
  54.                 var node2 = document.createTextNode(" 预览  ");  
  55.                 a2.appendChild(node2);  
  56.                 a2.setAttribute("href","#");  
  57.                 a2.setAttribute("id","a2"+i);  
  58.                 a2.onclick=function(){  
  59.                     //console.log();  
  60.                     //console.log(data);  
  61.                     var id=this.id;  
  62.                     var formId=id.substring(2);  
  63.                     var form=data[formId].form;  
  64.                     form.replace("{","");  
  65.                     form.replace("}","");  
  66.                     form.replace("|","");  
  67.                     //console.log(document.getElementById(id).innerText);  
  68.                     win_parse=window.open('','','width=800,height=400,alwaysRaised=yes,top=100,left=200');  
  69.                     var str='<div style="width:500px;height:300px;border:1px solid grey">'+form+'</div>';  
  70.                     win_parse.document.write(str);  
  71.                     win_parse.focus();       
  72.                     //document.getElementById("div2").write(str);  
  73.                 };  
  74.                   
  75.                 td3.appendChild(a1);  
  76.                 td3.appendChild(a2);  
  77.                 tr.appendChild(td0);  
  78.                 tr.appendChild(td1);  
  79.                 tr.appendChild(td2);  
  80.                 tr.appendChild(td3);  
  81.                 tables.appendChild(tr);  
  82.         }  
  83.     }  
  84. })  
  85. })  
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;
};

在节点生成进程中,同不常候可生产节点的Path(节点路线),方便寻找

        (2卡塔尔国创建表单:activiti自定义流程之自定义表单(二):创建表单

slider 和 colorPicker 都以 HT 自定义的滑动条和颜色选取器,实际情况请参谋 HT for Web 表双手册。

FAQ:

 

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

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);

 

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]
    });
};

 

  1. /** 
  2.      * 查询表单列表 
  3.      *  
  4.      * @author:tuzongxun 
  5.      * @Title: findForms 
  6.      * @Description: TODO 
  7.      * @param @return 
  8.      * @date Mar 28, 2016 4:29:58 PM 
  9.      * @throws 
  10.      */  
  11.     public List<Map<String, String>> findForms() {  
  12.         Connection connection = this.getDb();  
  13.         Statement statement;  
  14.         List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
  15.         try {  
  16.             statement = connection.createStatement();  
  17.             ResultSet resultSet = statement  
  18.                     .executeQuery("select * from formtest");  
  19.             while (resultSet.next()) {  
  20.                 Map<String, String> map = new HashMap<String, String>();  
  21.                 String formString = resultSet.getString(2);  
  22.                 // resultSet.getString(2);  
  23.                 System.out.println("formString:" + formString);  
  24.                 map.put("formId", resultSet.getString(1));  
  25.                 map.put("formType", resultSet.getString(2));  
  26.                 map.put("form", resultSet.getString(3));  
  27.                 list.add(map);  
  28.             }  
  29.             ;  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.         return list;  
  34.     }  
  35.   
  36.   
  37.     /** 
  38.      * 删除表单 
  39.      *  
  40.      * @author:tuzongxun 
  41.      * @Title: addForm 
  42.      * @Description: TODO 
  43.      * @param @param formType 
  44.      * @param @param string 
  45.      * @param @return 
  46.      * @date Mar 28, 2016 4:30:18 PM 
  47.      * @throws 
  48.      */  
  49.     public void deleteForm(String formId) {  
  50.         try {  
  51.             Connection connection = this.getDb();  
  52.             PreparedStatement ps = connection  
  53.                     .prepareStatement("delete from  formtest where formId=?");  
  54.             ps.setString(1, formId);  
  55.             ps.executeUpdate();  
  56.   
  57.   
  58.             connection.close();  
  59.         } catch (Exception e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.     }  

进而创设弹力球,轻便生成叁个3D 节点,通过安装这几个节点的 style 样式属性来决定节点的呈现格局,当中校“shape3d”设置为“sphere”就可以将 ht.Node 六面体变成 3D 球人体模型型,再设置“shape3d”属性为眼下定义的率性颜色,s3 是 HT 封装的设置 3D 节点大小的 setSize3d 函数的简写,最终将这几个节点增添进数据模型 dataModel 中:

异步加载,按需加载的景况也是异平日用的,使用的是SQL Azure服务器在U.S.ing,所以可能异步有一些慢,本地数据源那是弹指间的

 17727.com 3117727.com 32

17727.com 33

17727.com 34 17727.com 35 17727.com 36

 

 

复制代码 代码如下:

注:(1卡塔尔国情况安排:activiti自定义流程之自定义表单(后生可畏):遭逢安插

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

  

 17727.com 3717727.com 38

本例地址:

复制代码 代码如下:

[java] view plain copy

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种颜色
};

挂号事件,选拔参数parent,即从某风流倜傥父节点开首增大事件(因为做了个hover效果,所以事件是在各种节点上,假使裁撤该意义,事件可向来附加Tree上通过伊夫nt的srcElement来散发可略提高质量)

二、 js文件formList.js:  

ht.layout.Force3dLayout类提供 3D弹力布局,构造函数可传入 DataModel和 Graph3dView三种参数。 默许仅对未选中图元举办构造,借使构造函数参数为 Graph3dView时,则视图组件的 isMovable和 isVisible函数将影响图元是还是不是可布局, 图元 style上的 layoutable质量也可设为 false截留图元参加布局。

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"卡塔尔(英语:State of Qatar)卡塔尔 { //- 号须要降低
$(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卡塔尔(英语:State of Qatar); //向上关联
}
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);
}
}
}

 

HT 将客户自定义的性能和 HT 暗中认可的性质调用方法分为 node.a 和 node.s 那样就能够将四头有效地区分开来(具体参照 HT for Web 入门手册 style 章节),大家在创制管线的时候就用了这种措施:

17727.com 39

[java] view plain copy

分子力(molecular force卡塔尔,又称分子间功效力、范得瓦耳斯力,是指成员间的相互影响。当二分子相距较远时,首要表现为吸重力,这种力着重来自二个成员被另多少个成员任何时候间快捷变化的电偶极矩所极化而滋生的相互作用;当二分子特别周边时,则排挤力成为第意气风发的,那是出于各成员的外层电子云开头重叠而发出的排外作用。

 

[java] view plain copy

最神秘的是怎可以做出让三个节点“若离若即”的法力?

最终来看下效果啊?

 17727.com 4017727.com 41

进展节点,异步央求的片段代码应该不是很复杂就不细诉了,关键来说一下级联
级联有三个难题要拍卖,第多个是遍历子节点,第3个是上溯到祖节点,因为咱们的数据结构那八个操作都呈现特简单

 

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

 17727.com 4217727.com 43

先来看下效果图

  1. public Object addForm(String formType, String string);  
  2. public void deleteForm(String formId);  

复制代码 代码如下:

 Service类相关办法:

复制代码 代码如下:

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

复制代码 代码如下:

17727.com 44 IE8下举行到第5级

17727.com 45

复制代码 代码如下:

那边最首要的照旧node的click事件,因为他要管理的作业比较多,如树的张开减少(假使实节点荒诞不经,然而hasChildren为真,同一时候complete属性不为真则须要异步加载子节点,如子节点存在,但是未有Render那么就要Render),点击checkbox要出发级联的事件和oncheckbox事件,点击任何则触发配置规范化的nodeonclick事件,那风华正茂体都因而后边event的源成分的class来区分点击的对象

率先步:自然是颇负Jquery的控件的首先步都是搭这一个架子,宽容JQuery和$幸免闭包,防止和此外类库冲突,选拔一个参数(是个对象)

.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;
}

上面是CSS的全体代码

规定了节点的HTML我们就足以来写CSS了。有了效劳图,有个节点结构接着就编写CSS了

复制代码 代码如下:

复制代码 代码如下:

/***********这里是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;
}

2:明确数据布局

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>");
}
}

1:扶助静态的树,即贰回性将总体多少加载到客商端。
2:异步树,即贰次只加载一级或若干级节点,子节点能够异步加载数据。
3:Checkbox树(大概是静态树也大概是异步树),用于选拔(如接收组织机关,接纳数据字典项)等,最棒是能力所能达到帮忙节点级联(这么些是难关)
4:能够承袭大数据量,并质量表现美好
5:可以在主流浏览器中运转杰出

/* Fix for ie rootVisible:false issue,改善叁个I艾德ebug */
.bbit-tree-root {
zoom:1;
}

1:如何设置每一个节点区别的Logo?

;(function($) {
//也可以使用$.fn.extend(treeview:function(setting卡塔尔(英语:State of Qatar){}卡塔尔(英语:State of Qatar)
$.fn.treeview = function(settings) {
}
})(jQuery);

 

复制代码 代码如下:

1:扶助静态的树,即一回性将一切数量加载到顾客端。 2:异步树,即一回只加载拔尖或若干...

/****************************************
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);
17727.com,}
}
}
}
//冒泡的祖宗
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卡塔尔(英语:State of Qatar).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);

那正是说我们要开工了;

复制代码 代码如下:

那第二步:给控件加一些参数暗许参数,同临时间能调用方法$.extend让最后调用时的参数覆盖暗中同意的(若无则采用默许)

  • 再有部分是div套table的艺术,CSDN的领航树便是这种,是种折中的方法(节点也不算太复杂,何况CSS也比较好写),如下图所示
    17727.com 46

css中所用到的持有图片

上边了树的主导样式外,定义了贰个有+号带line的体制和+号不带line的体制

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

  • 正如土的是table套table的(样式上好调控,可是大数据量,和档次较深的树,这种组织自然顶不住的)
  • 再有风流倜傥种是相比较奇特的UL套LI的艺术,那是前几天数不胜数书选择的不二法门如Jquery.treeview正是接纳的这种格式,好处相比显著便是组织轻巧,
    同期在不帮助Js的浏览器上,相似也能表现出树的形态(这种状态实际上作者能够忽视),不过Jquery.treeview的节点在IE下,特别是IE6下无法被里面因素撑开,(IE7,8当到达自然深度时不或者撑开),请奇异的意况(作者揣度是因为使用padding来做缩进,margin-left:负值来决定Logo地方有关,不过改过起来难度也相当大),在这里种情况下书会变形(Jquery.treeview)就有这种主题材料,只可以通过设置节点的width来解决。

依据本人的类型实市价况,首假如多少个关键点:

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
},
...
]

在节点的数据结构中得以设置属性classes ,该属性将作为节点特殊的Css Class 增多到节点上。那么利用那点,就足以设置节点的Logo了

17727.com 47

17727.com 48

事实上毫不扩充,本人就帮忙,只是未有注解而已,大家来看一下以此代码吧?在BuildNode方法中有那般一句?      
if (nd.classes) { cs.push(nd.classes); }

自身的树节点结构

//遍历子节点
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;
}
}

复制代码 代码如下:

本文由17727发布于web前端信息,转载请注明出处:表单列表及预览和删除,打造基于jQuery的高性能

关键词: