Dracula Graph js节点点击事件

Dracula Graph js node on click event

本文关键字:事件 节点 Graph js Dracula      更新时间:2023-09-26

我有以下函数,它使用Dracula js在画布上创建一个图。

var populateGraphEntities = function(element) {
  var filteredQuery = [];
  if(query != 'query6') {
    for(var k in query) {
      if(new Date(query[k].date) > startingDate && new Date(query[k].date) < endingDate) {
        var regions = [];
        for(var j in query[k].entities) {
          if(query[k].entities[j].type == 'Location') {
            if(query[k].entities[j].code) {
              regions.push(query[k].entities[j].code);
            }
          }
        }
        var common = $.grep(selectedRegions, function(element) {
            return $.inArray(element, regions) !== -1;
        });
        if(common.length != 0) {
          filteredQuery.push(query[k]);
        }
      }
    }
  }
  var dimensionX = 120;
  var dimensionY = 60;
  var renderEntity = function(r, n) {
    var popUp;
    var set = r.set().push(
    r.rect(n.point[0], n.point[1], dimensionX, dimensionY).click(function () {console.log(this.data("i"));}).attr({
      "fill": '#A0302D',
      "stroke-width": 2,
      r: "9px"
    })).push(r.text(n.point[0]+(dimensionX/2), n.point[1]+(dimensionY/2), n.label).attr({
      "font-size": "12px"
    }));
    set.hover(
      function mouseIn() {
        graphEntitiesVariable='IN';
      },
      function mouseOut() {
        graphEntitiesVariable='OUT';
      }
    );
    return set;
  };
  var renderPerson = function(r, n) {
    var set = r.set().push(
    r.rect(n.point[0], n.point[1], dimensionX, dimensionY).click(function () {console.log(this.data("i"));}).attr({
      "fill": '#2E9DB2',
      "stroke-width": 2,
      r: "9px"
    })).push(r.text(n.point[0]+(dimensionX/2), n.point[1]+(dimensionY/2), n.label).attr({
      "font-size": "12px"
    }));
    return set;
  };
  var renderEvent = function(r, n) {
    var set = r.set().push(
    r.rect(n.point[0], n.point[1], dimensionX, dimensionY).click(function () {console.log(this.data("i"));}).attr({
      "fill": '#D6D825',
      "stroke-width": 2,
      r: "9px"
    })).push(r.text(n.point[0]+(dimensionX/2), n.point[1]+(dimensionY/2), n.label).attr({
      "font-size": "12px"
    }));
    set.click(
      function onClick() {
        console.log('click');
      }
    );
    return set;
  };
  var renderOrganization = function(r, n) {
    var set = r.set().push(
    r.rect(n.point[0], n.point[1], dimensionX, dimensionY).click(function () {console.log(this.data("i"));}).attr({
      "fill": '#B9C5B4',
      "stroke-width": 2,
      r: "9px"
    })).push(r.text(n.point[0]+(dimensionX/2), n.point[1]+(dimensionY/2), n.label).attr({
      "font-size": "12px"
    }));
    return set;
  };
  var renderLocation = function(r, n) {
    var set = r.set().push(
    r.rect(n.point[0], n.point[1], dimensionX, dimensionY).click(function () {console.log(this.data("i"));}).attr({
      "fill": '#66CD00',
      "stroke-width": 2,
      r: "9px"
    })).push(r.text(n.point[0]+(dimensionX/2), n.point[1]+(dimensionY/2), n.label).attr({
      "font-size": "12px"
    }));
    return set;
  };
  var leftMainContent = document.getElementById("left-main-content");
  var graph = '<div style="background-color: #F9F9F9" id="canvas"></div>';
  leftMainContent.innerHTML = '';
  leftMainContent.innerHTML = graph;
  var g = new Graph();
  g.addNode('Entity', {label: 'Entity', render: renderEntity});
  for(var k=0; k<filteredQuery.length; k++) {
    for(var j=0; j<filteredQuery[k].entities.length; j++) {
      if(filteredQuery[k].entities[j].type == 'Person') {
        g.addNode('Person', {label: 'Person', render: renderPerson});
        g.addEdge('Entity', 'Person', { stroke : "#bfa" , fill : "#56f", label : "is-a"});
        g.addNode(filteredQuery[k].entities[j].name, {label: filteredQuery[k].entities[j].name, render: renderPerson});
        g.addEdge('Person', filteredQuery[k].entities[j].name, { stroke : "#bfa" , fill : "#56f", label : "is-a"});
      }
      else if(filteredQuery[k].entities[j].type == 'Location') {
        if(filteredQuery[k].entities[j].partof) {
          g.addNode(filteredQuery[k].entities[j].name, {label: filteredQuery[k].entities[j].name, render: renderLocation});
          g.addNode(filteredQuery[k].entities[j].partof, {label: filteredQuery[k].entities[j].partof, render: renderLocation});
          g.addEdge(filteredQuery[k].entities[j].name, filteredQuery[k].entities[j].partof, { stroke : "#bfa" , fill : "red", label : "part-of"});
        }
        else {
          g.addNode('Location', {label: 'Location', render: renderLocation});
          g.addEdge('Entity', 'Location', { stroke : "#bfa" , fill : "#56f", label : "is-a"});
          g.addNode(filteredQuery[k].entities[j].name, {label: filteredQuery[k].entities[j].name, render: renderLocation});
          g.addEdge('Location', filteredQuery[k].entities[j].name, { stroke : "#bfa" , fill : "#56f", label : "is-a"});
        }          
      }
      else if(filteredQuery[k].entities[j].type == 'Event') {
        g.addNode('Event', {label: 'Event', render: renderEvent});
        g.addEdge('Entity', 'Event', { stroke : "#bfa" , fill : "#56f", label : "is-a"});
        g.addNode(filteredQuery[k].entities[j].name, {label: filteredQuery[k].entities[j].name, render: renderEvent});
        g.addEdge('Event', filteredQuery[k].entities[j].name, { stroke : "#bfa" , fill : "#56f", label : "is-a"});
      }
      else if(filteredQuery[k].entities[j].type == 'Organization') {
        g.addNode('Organization', {label: 'Organization', render: renderOrganization});
        g.addEdge('Entity', 'Organization', { stroke : "#bfa" , fill : "#56f", label : "is-a"});
        g.addNode(filteredQuery[k].entities[j].name, {label: filteredQuery[k].entities[j].name, render: renderOrganization});
        g.addEdge('Organization', filteredQuery[k].entities[j].name, { stroke : "#bfa" , fill : "#56f", label : "is-a"});
      }
    }
  }
  var layouter = new Graph.Layout.Spring(g);
  layouter.layout();
  var renderer = new Graph.Renderer.Raphael('canvas', g, 930, 475);
  renderer.draw();
}

我创建了自定义渲染器来成功处理鼠标输入/输出事件,但我找不到onclick事件的任何位置。如何处理节点上的单击?

感谢

嗨,我正在使用:

var set = r.set().push(
r.rect(n.point[0]-w*6/2, n.point[1]-13, w*6, 20).attr({"fill": "#eeeeee", r : "12px", "stroke-width" : n.distance == 0 ? "3px" : "1px" })).push(
r.text(n.point[0], n.point[1], n.label ).click(function () {
    toogleTable(n.id);
}));