您现在的位置:首页 >> 前端 >> 内容

jTopo通过给node添加属性以达到只传参数而不显示的功能

时间:2017/1/19 10:45:00 点击:

  核心提示:进入正题:需求:现在是2017.1.18日,最近的工作接到了这样一个需求,A~Z端口的时延信息统计,并被推荐了一个大概两到三年前非常火的控件:jTopo,对于绘图来说,这确实算得上一个简单、高效的插件...

进入正题:

需求:

现在是2017.1.18日,最近的工作接到了这样一个需求,A~Z端口的时延信息统计,并被推荐了一个大概两到三年前非常火的控件:jTopo,对于绘图来说,这确实算得上一个简单、高效的插件,但是在使用的过程中,不可避免的遇到一些需求中需要但控件中自己没有的东西。

jTopo的使用我简单介绍一下,官方的Demo已经将大多数的功能都一一列举了,想做出什么厉害的东西还是要靠能力和想象力,重点的传参就放到文章的末尾了。

组件

当然是jTopo了,当然还用到了jquery。jTopo官方下载链接

导入我们的插件,我用的是0.4.8版本:

<!-- jTopo start -->  
<script src="../js/libs/jTopo_0.4.8.min.js"></script>  
<!-- jTopo end --> 

初始化:

本案例中,需要做右键菜单栏,右键菜单的一些样式:

<style>  
    #contextmenu {  
        border: 1px solid #aaa;  
        border-bottom: 0;  
        background: #eee;  
        position: absolute;  
        list-style: none;  
        margin: 0;  
        padding: 0;  
        display: none;  
    }  
  
    #contextmenu li a {  
        display: block;  
        padding: 10px;  
        border-bottom: 1px solid #aaa;  
        cursor: pointer;  
    }  
  
    #contextmenu li a:hover {  
        background: #fff;  
    }  
</style>

我请求的一些假的数据:

[  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"2",  
    "z_name":"伦敦",  
    "z_name_en":"London",  
    "delay":50  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"9",  
    "z_name":"伦敦",  
    "z_name_en":"London",  
    "delay":190  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"10",  
    "z_name":"上海",  
    "z_name_en":"London",  
    "delay":180  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"11",  
    "z_name":"澳门",  
    "z_name_en":"London",  
    "delay":170  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"12",  
    "z_name":"香港",  
    "z_name_en":"London",  
    "delay":150  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"13",  
    "z_name":"华盛顿",  
    "z_name_en":"London",  
    "delay":140  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"14",  
    "z_name":"新西兰",  
    "z_name_en":"London",  
    "delay":130  
  },  
  {  
    "a_id":"1",  
    "a_name":"北京",  
    "a_name_en":"beijing",  
    "z_id":"15",  
    "z_name":"纽约",  
    "z_name_en":"London",  
    "delay":120  
  }  
  
]

页面中body模块需要写的东西,即初始化所需要的容器:

    <canvas class="center-block" width="800" height="600" id="canvas" style=" background-color:#797979; border:1px solid #8c8c8c;">  
    </canvas>  
  
<ul id="contextmenu" style="display:none;">  
    <li><a>查看历史时延</a></li>  
    <!--    <li><a>逆时针旋转</a></li>  
            <li><a>更改颜色</a></li>  
            <li><a>放大</a></li>  
            <li><a>缩小</a></li>  
            <li><a>删除该节点</a></li>-->  
</ul>

初始化Jtopo:

var canvas = document.getElementById('canvas');  
var stage = new JTopo.Stage(canvas);  
//显示工具栏  
//showJTopoToobar(stage);  
var scene = new JTopo.Scene();  
stage.frames = 24;  
//scene.background = '../images/back-ground/bg.jpg';  
scene.alpha = 1;  
scene.backgroundColor = '63,74,89';  
stage.add(scene);  
  
$.ajax({  
    type: "get",  
    url: "datasource/link_data.json",  
    dataType: "json",  
    success: function (data) {  
        var cloudNode = new JTopo.Node(data[0].a_name);  
        //cloudNode.radius = 10; // 半径  
        //cloudNode.fillColor = '50,255,0'; // 填充颜色  
        cloudNode.setLocation(400,300);  
        cloudNode.layout = {type: 'circle', radius: 250};  
        cloudNode.setImage('../images/weizhi.png', true);  
        cloudNode.textOffsetY = -37; // 文本偏移量(向上37像素)  
        cloudNode.id = data[0].a_id;  
        scene.add(cloudNode);  
  
  
        for(var i=0; i<data.length; i++) {  
            var node = new JTopo.Node(data[i].z_name);  
            //node.fillColor = '50,255,0';  
            //node.radius = 10;  
            node.setLocation(scene.width * Math.random(), scene.height * Math.random());  
            node.layout = {type: 'circle', radius: 80};  
            node.setImage('../images/weizhi.png', true);  
            node.textOffsetY = -37; // 文本偏移量(向上37像素)  
            node.id = data[i].z_id;  
  
            /*//告警start 
            if(data[i].delay>=120&&data[i].delay<=180){ 
                node.alarm = "二级告警"; 
            } 
            if(data[i].delay>180){ 
                node.alarm = "一级告警"; 
            } 
 
 
            setInterval(function(){ 
                if(node.alarm == '二级告警'){ 
                    node.alarm = null; 
                }else{ 
                    node.alarm = '二级告警' 
                } 
            }, 600); 
            //告警 end*/  
            scene.add(node);  
  
  
            var delay = data[i].delay + "ms";  
            var link = new JTopo.Link(cloudNode, node,delay);  
            link.textOffsetY = 15; // 文本偏移量(向下15个像素)  
            //link.text(data[i].delay);  
            link.strokeColor = '50,255,0';  
  
            scene.add(link);  
            //添加右键点击事件  
            var currentNode = null;  
            function handler(event){  
                if(event.button == 2){// 右键  
                    // 当前位置弹出菜单(p)  
                    $("#contextmenu").css({  
                        top: event.pageY,  
                        left: event.pageX  
                    }).show();  
                }  
            }  
            link.addEventListener('mouseup', function(event){  
                currentLink = this;  
                handler(event);  
            });  
            stage.click(function(event){  
                if(event.button == 0){// 右键  
                    // 关闭弹出菜单(p)  
                    $("#contextmenu").hide();  
                }  
            });  
  
  
            //点击事件 end  
  
  
        }  
        JTopo.layout.layoutNode(scene, cloudNode, true);  
  
        scene.addEventListener('mouseup', function(e){  
            if(e.target && e.target.layout){  
                JTopo.layout.layoutNode(scene, e.target, true);  
            }  
        });  
  
  
  
  
        $("#contextmenu a").click(function() {  
            var text = $(this).text();  
  
            if (text == '查看历史时延') {  
                alert("时延:"+currentLink.text+",A节点ID:"+currentLink.nodeA.id+",Z节点ID:"+currentLink.nodeZ.id);  
                console.log(currentLink);  
                console.log(currentLink.text);  
                console.log(currentLink.nodeA);  
                console.log(currentLink.nodeZ);  
            }  
            $("#contextmenu").hide();  
        });  
  
    },  
    error:function(data){  
        alert("网络连接失败");  
    }  
});

其中一些组件,node、link的初始化,demo中有更加详细的教程,这里就不做过多的介绍了。当然,如果你直接copy了这段代码,是不能使用的,这是由于node本身是没有id这个属性的,这就需要我们自己去源码中添加这个属性了。好在源码还不是很长...

首先找到这一行,这里边是node的一些属性:添加一个“id,”,如果是通过搜索找的话应该查 c="text 马上就能找的到

jTopo通过给node添加属性以达到只传参数而不显示的功能

然后找到elementType是node的,也就是node初始化时候的一些参数,添加this.id=null;

jTopo通过给node添加属性以达到只传参数而不显示的功能

项目到这里基本上就可以跑通了,对于node、textNode、LinkNode、link或者其它一些类型的节点,凡是需要隐藏域携带值的,用以上方法都可以实现。以上就是我在开发中遇到的需求以及解决的方法。

结果展示:

初始化后界面显示:

jTopo通过给node添加属性以达到只传参数而不显示的功能

点击右键弹出菜单栏:

jTopo通过给node添加属性以达到只传参数而不显示的功能

查看时延:

jTopo通过给node添加属性以达到只传参数而不显示的功能

Tags:JT TO OP PO 
作者:网络 来源:linkedin_3