helcim
helcim

Reputation: 819

How to use modifiers with click event in vis.js?

Is it possible to have an ALT+click, CTL+SHIFT+click, etc. events in vis.js network? How functions using such events can be defined and used?

Upvotes: 0

Views: 3433

Answers (2)

LaurentP13
LaurentP13

Reputation: 66

Yes it is possible, though not documented. What you have to do is to fetch the original JavaScript event. Once you have it, you can deploy the usual tricks.

For a click event, as declared by, say network.on('click', function(e) {...}); you reach the original event with let oEvent = e.event.srcEvent;

Then you can test for oEvent.shiftKey, etc. within the callback.

This works also for doubleClick. Note that for hover events you access the original JS event with let oEvent = e.event; (no srcEvent).

In case of doubt, just open the JS console in your browser and explore e data structure.

By the way, I'd also like to recommend this post on how to decipher a click from a doubleClick in vis.js, as a doubleClick also triggers a click! I've included it in the following snippet.

Summary:

/* DECLARING EVENTS */
network.on('doubleClick', function(e) {onDoubleClick(e)});
network.on('click', function(e) {onClick(e)});
network.on('hoverNode', function (e) {doOnHoverNode(e)});
network.on('blurNode', function (e) {doOnBlurNode(e)});

/* MANAGING DOUBLE VS SINGLE CLICK */
let doubleClickTime = 0;
const threshold = 200;

function onClick(e) {
  const t0 = new Date();
  if (t0 - doubleClickTime > threshold) {
    setTimeout(function () {
      if (t0 - doubleClickTime > threshold) {
        doOnClick(e);
      }
    },threshold);
  }
}

function onDoubleClick(e) {
  doubleClickTime = new Date();
  doOnDoubleClick(e)
}

/* DEFINE CALLBACKS HERE */
function doOnClick(e) {
  // fetch id of node clicked upon
  let nodeId = e.nodes[0];
  // fetch original JS event
  let jsEvent = e.event.srcEvent;
  // match modifiers
  let  shift = jsEvent.shiftKey;
  let  alt = jsEvent.altKey;
  let  meta = jsEvent.metaKey;
  // do callback
  if (meta) {
    if (shift)
      // do stuff
    else
      // do stuff
  }
}

function doOnDoubleClick(e) {
  // don't delete the following line!
  doubleClickTime = new Date();
  // the rest just like click

function doOnHoverNode(e) {
  // fetch id of node clicked upon
  let nodeId = e.nodes[0];
  // fetch original JS event
  let jsEvent = e.event;
  // the rest just like click
}

function doOnBlurNode(e) {
  // ditto doOnHoverNode
}

Hope this helps.

Upvotes: 1

helcim
helcim

Reputation: 819

It is not possible to use keyboard modifiers with click events using vis.js in network module (see http://visjs.org/docs/network/#Events).

Upvotes: 0

Related Questions