Arbor Js - Node Onclick?

后端 未结 4 495
谎友^
谎友^ 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: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;
     }
    

提交回复
热议问题