前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >d3.js在博客园中的展示例子

d3.js在博客园中的展示例子

作者头像
用户1174963
发布2018-01-17 11:29:21
1K0
发布2018-01-17 11:29:21
举报
文章被收录于专栏:python学习指南python学习指南
代码语言:js
复制
<style><!--
.link { 
  stroke: red; 
  stroke-linejoin:bevel;
}
.link_error{
    stroke:red;
    stroke-linejoin:bevel;
}
.nodetext {
    font: 12px sans-serif;
    -webkit-user-select:none;
    -moze-user-select:none;
    stroke-linejoin:bevel;
 
}
#container{
  width: 700px;
  height: 400px;
  border-radius: 5px;
  background-color: white;
  position: relative;
  margin: 10px;
}
--></style>
<p>&nbsp;</p>
<div id="container">&nbsp;</div>
<p>
<script charset="UTF-8" type="text/javascript" src="http://files.cnblogs.com/files/miqi1992/d3.v3.min.js"></script>
<script type="text/javascript">// <![CDATA[
function Topology(ele){
    typeof(ele)=='string' && (ele=document.getElementById(ele));
    var w=ele.clientWidth,
        h=ele.clientHeight,
        self=this;
    this.force = d3.layout.force().gravity(.05).distance(200).charge(-800).size([w, h]);
    this.nodes=this.force.nodes();
    this.links=this.force.links();
    this.clickFn=function(){};
    this.vis = d3.select(ele).append("svg:svg")
                 .attr("width", w).attr("height", h).attr("pointer-events", "all");
    this.force.on("tick", function(x) {
      self.vis.selectAll("g.node")
          .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
      self.vis.selectAll("line.link")
          .attr("x1", function(d) { return d.source.x; })
          .attr("y1", function(d) { return d.source.y; })
          .attr("x2", function(d) { return d.target.x; })
          .attr("y2", function(d) { return d.target.y; });
    });
}

Topology.prototype.doZoom=function(){
    d3.select(this).select('g').attr("transform","translate(" + d3.event.translate + ")"+ " scale(" + d3.event.scale + ")");
}

//增加节点
Topology.prototype.addNode=function(node){
    this.nodes.push(node);
}
Topology.prototype.addNodes=function(nodes){
    if (Object.prototype.toString.call(nodes)=='[object Array]' ){
        var self=this;
        nodes.forEach(function(node){
            self.addNode(node);
        });
    }
}
//增加连线
Topology.prototype.addLink=function(source,target){
    this.links.push({source:this.findNode(source),target:this.findNode(target)});
}
//增加多个连线
Topology.prototype.addLinks=function(links){
    if (Object.prototype.toString.call(links)=='[object Array]' ){
        var self=this;
        links.forEach(function(link){
            self.addLink(link['source'],link['target']);
        });
    }
}

//删除节点
Topology.prototype.removeNode=function(id){
    var i=0,
        n=this.findNode(id),
        links=this.links;
    while ( i < links.length){
        links[i]['source']==n || links[i]['target'] ==n ? links.splice(i,1) : ++i;
    }
    this.nodes.splice(this.findNodeIndex(id),1);
}
//删除节点下的子节点,同时清除link信息
Topology.prototype.removeChildNodes=function(id){
    var node=this.findNode(id),
        nodes=this.nodes;
        links=this.links,
        self=this;
    var linksToDelete=[],
        childNodes=[];
 
    links.forEach(function(link,index){
        link['source']==node 
            && linksToDelete.push(index) 
            && childNodes.push(link['target']);
    });
    linksToDelete.reverse().forEach(function(index){
        links.splice(index,1);
    });
    var remove=function(node){
        var length=links.length;
        for(var i=length-1;i>=0;i--){
            if (links[i]['source'] == node ){
               var target=links[i]['target'];
               links.splice(i,1);
               nodes.splice(self.findNodeIndex(node.id),1);
               remove(target);
 
            }
        }
    }
    childNodes.forEach(function(node){
        remove(node);
    });
    //清除没有连线的节点
    for(var i=nodes.length-1;i>=0;i--){
        var haveFoundNode=false;
        for(var j=0,l=links.length;j<l;j++){
            ( links[j]['source']==nodes[i] || links[j]['target']==nodes[i] ) && (haveFoundNode=true) 
        }
        !haveFoundNode && nodes.splice(i,1);
    }
}
//查找节点
Topology.prototype.findNode=function(id){
    var nodes=this.nodes;
    for (var i in nodes){
        if (nodes[i]['id']==id ) return nodes[i];
    }
    return null;
}

//查找节点所在索引号
Topology.prototype.findNodeIndex=function(id){
    var nodes=this.nodes;
    for (var i in nodes){
        if (nodes[i]['id']==id ) return i;
    }
    return -1;
}
//节点点击事件
Topology.prototype.setNodeClickFn=function(callback){
    this.clickFn=callback;
}
//更新拓扑图状态信息
Topology.prototype.update=function(){
  var link = this.vis.selectAll("line.link")
      .data(this.links, function(d) { return d.source.id + "-" + d.target.id; })
      .attr("class", function(d){
            return d['source']['status'] && d['target']['status'] ? 'link' :'link link_error';
      });
  link.enter().insert("svg:line", "g.node")
      .attr("class", function(d){
         return d['source']['status'] && d['target']['status'] ? 'link' :'link link_error';
      });
  link.exit().remove();
  var node = this.vis.selectAll("g.node")
      .data(this.nodes, function(d) { return d.id;});
  var nodeEnter = node.enter().append("svg:g")
      .attr("class", "node")
      .call(this.force.drag);
  //增加图片,可以根据需要来修改
  var self=this;
  nodeEnter.append("svg:image")
      .attr("class", "circle")
      .attr("xlink:href", function(d){
         //根据类型来使用图片
         return d.expand ? "http://images.cnblogs.com/cnblogs_com/miqi1992/845581/o_p1668369390.jpg" : "http://images.cnblogs.com/cnblogs_com/miqi1992/845581/o_p1668369390.jpg";
      })
      .attr("x", "-32px")
      .attr("y", "-32px")
      .attr("width", "64px")
      .attr("height", "64px")
      .on('click',function(d){ d.expand && self.clickFn(d);})
  nodeEnter.append("svg:text")
      .attr("class", "nodetext")
      .attr("dx", 15)
      .attr("dy", -35)
      .text(function(d) { return d.id });
 
  node.exit().remove();
  this.force.start();
}

var topology=new Topology('container');
var nodes=[
    {id:'10.4.42.1',type:'router',status:1},
    {id:'10.4.43.1',type:'switch',status:1,expand:true},
    {id:'10.4.44.1',type:'switch',status:1},
    {id:'10.4.45.1',type:'switch',status:0}
];
var childNodes=[
    {id:'10.4.43.2',type:'switch',status:1},
    {id:'10.4.43.3',type:'switch',status:1}
];
var links=[
    {source:'10.4.42.1',target:'10.4.43.1'},
    {source:'10.4.42.1',target:'10.4.44.1'},
    {source:'10.4.42.1',target:'10.4.45.1'}
];
var childLinks=[
    {source:'10.4.43.1',target:'10.4.43.2'},
    {source:'10.4.43.1',target:'10.4.43.3'},
    {source:'10.4.43.2',target:'10.4.43.3'}
]

topology.addNodes(nodes);
topology.addLinks(links);
//可展开节点的点击事件
topology.setNodeClickFn(function(node){
    if(!node['_expanded']){
        expandNode(node.id);
        node['_expanded']=true;
    }else{
        collapseNode(node.id);
        node['_expanded']=false;
    }
});
topology.update();

function expandNode(id){
    topology.addNodes(childNodes);
    topology.addLinks(childLinks);
    topology.update();
}
function collapseNode(id){
    topology.removeChildNodes(id);
    topology.update();
}
// ]]></script>
</p>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档