Arbor Js - Node Onclick?

后端 未结 4 494
谎友^
谎友^ 2021-02-03 11:52

I\'m using arbor.js to create a graph.

How do I create an onclick event for a node, or make a node link somewhere upon being clicked?

The Arborjs.or

相关标签:
4条回答
  • 2021-02-03 12:16

    In the script renderer.js is the handler for the mouse events, so you can add your code to create your functions.

    I modified the renderer.js to add the click and double-click functions.

    var handler = {
        clicked:function(e){
            var pos = $(canvas).offset();
            _mouseP = arbor.Point(e.pageX-pos.left, e.pageY-pos.top)
            selected = nearest = dragged = particleSystem.nearest(_mouseP);
            if (dragged.node !== null) dragged.node.fixed = true
            $(canvas).bind('mousemove', handler.dragged)
            $(window).bind('mouseup', handler.dropped)
            $(canvas).bind('mouseup', handler.mypersonalfunction)
        },
        mypersonalfunction:function(e){
            if (dragged===null || dragged.node===undefined) return
            if (dragged.node !== null){
                dragged.node.fixed = false                  
                var id=dragged.node.name;
                alert('Node selected: ' + id);
            }            
            return false
        },
    

    You can check the clic and double-click functions in this page.

    I add nodes and edges when a node has been clicked and I add edges to other nodes when the node has been double-clicked (the blue,yellow and green ones)

    0 讨论(0)
  • 2021-02-03 12:16

    I´m looking for similar customization for selection over each node id value. How would it be if instead of mouse-handler trigger, the selection was made via checkbox inside each node?

    <input type=checkbox name=mycheckbox[]>
    
    0 讨论(0)
  • 2021-02-03 12:34

    If you look at the atlas demo code (in github) you will see towards the bottom there are a selection of mouse event functions, if you look at:

    $(canvas).mousedown(function(e){
                var pos = $(this).offset();
                var p = {x:e.pageX-pos.left, y:e.pageY-pos.top}
                selected = nearest = dragged = particleSystem.nearest(p);
    
                if (selected.node !== null){
                // dragged.node.tempMass = 10000
                    dragged.node.fixed = true;
                }
                return false;
            });
    

    This is being used to control the default node "dragging" functionality. In here you can trigger the link you want.

    I would add the link URL to the node json that you are passing back to define each node, so your original JSON posted becomes something like:

    nodes:{
    threadstarter:{'color':'red','shape':'dot','label':'Animals'},
    reply1:{'color':'green','shape':'dot','label':'dog', link:'http://stackoverflow.com'},
    reply2:{'color':'blue','shape':'dot','label':'cat', link:'http://stackoverflow.com'}
    },
    

    Then, you can update the mouseDown method to trigger the link (the current node in the mouse down method is "selected" so you can pull out the link like selected.node.data.link

    If you look at the original source for the arbor site to see how they have done it, they have a clicked function that is called on mouseDown event and then essentially does:

     $(that).trigger({type:"navigate", path:selected.node.data.link})
    

    (edited for your purposes)

    It is worth noting that whilst the Arbor framework and demos are open for use, their site isnt and is actually copyrighted, so only read that to see how they have done it, dont copy it ;)

    0 讨论(0)
  • 2021-02-03 12:34

    With the above solutions (including the one implemented at www.arborjs.org) although nodes can open links when clicked, they also lose their ability to be dragged.

    Based on a this question, that discusses how to distinguish between dragging and clicking events in JS, I wrote the following:

     initMouseHandling:function(){
        // no-nonsense drag and drop (thanks springy.js)
        selected = null;
        nearest = null;
        var dragged = null;
        var oldmass = 1
        var mouse_is_down = false;
        var mouse_is_moving = false
    
    
        // set up a handler object that will initially listen for mousedowns then
        // for moves and mouseups while dragging
        var handler = {
          mousemove:function(e){
            if(!mouse_is_down){
              var pos = $(canvas).offset();
              _mouseP = arbor.Point(e.pageX-pos.left, e.pageY-pos.top)
              nearest = particleSystem.nearest(_mouseP);
    
              if (!nearest.node) return false
              selected = (nearest.distance < 50) ? nearest : null
              if(selected && selected.node.data.link){
                dom.addClass('linkable')
              } else {
                dom.removeClass('linkable')
              }
            }
            return false
          },
          clicked:function(e){
            var pos = $(canvas).offset();
            _mouseP = arbor.Point(e.pageX-pos.left, e.pageY-pos.top)
            nearest = particleSystem.nearest(_mouseP);
    
            if (!nearest.node) return false
            selected = (nearest.distance < 50) ? nearest : null
    
            if (nearest && selected && nearest.node===selected.node){
              var link = selected.node.data.link
              if (link.match(/^#/)){
                 $(that).trigger({type:"navigate", path:link.substr(1)})
              }else{
                 window.open(link, "_blank")
              }
              return false
            }
          },
          mousedown:function(e){
            var pos = $(canvas).offset();
            _mouseP = arbor.Point(e.pageX-pos.left, e.pageY-pos.top)
            selected = nearest = dragged = particleSystem.nearest(_mouseP);
    
            if (dragged.node !== null) dragged.node.fixed = true
    
            mouse_is_down = true
            mouse_is_moving = false
    
            $(canvas).bind('mousemove', handler.dragged)
            $(window).bind('mouseup', handler.dropped)
    
            return false
          },
          dragged:function(e){
            var old_nearest = nearest && nearest.node._id
            var pos = $(canvas).offset();
            var s = arbor.Point(e.pageX-pos.left, e.pageY-pos.top)
    
            mouse_is_moving = true
    
            if (!nearest) return
            if (dragged !== null && dragged.node !== null){
              var p = particleSystem.fromScreen(s)
              dragged.node.p = p
            }
    
            return false
          },
    
          dropped:function(e){
            if (dragged===null || dragged.node===undefined) return
            if (dragged.node !== null) dragged.node.fixed = false
            dragged.node.tempMass = 50
            dragged = null
            selected = null
            $(canvas).unbind('mousemove', handler.dragged)
            $(window).unbind('mouseup', handler.dropped)
            _mouseP = null
    
            if(mouse_is_moving){
              // console.log("was_dragged")
            } else {
              handler.clicked(e)
            }
    
            mouse_is_down = false
    
            return false
          }
        }
        $(canvas).mousedown(handler.mousedown);
        $(canvas).mousemove(handler.mousemove);
    
      }
    
    }
    

    As you can see,

    • I made a difference between the clicked and mousedown handler functions.
    • I am opening links in new tabs. To simply redirect, change: window.open(link, "_blank") for
      window.location = link.
    • The above must replace your previous initMouseHandling function in the renderer.js file.
    • Define "dom" as: var dom = $(canvas)
    • You have to add the following css code to give feedback to the user.
     canvas.linkable{
       cursor: pointer;
     }
    
    0 讨论(0)
提交回复
热议问题