React Synthetic Event distinguish Left and Right click events

JavascriptReactjsDom Events

Javascript Problem Overview


I am trying to distinguish between left and right clicks in an onClick function:

const App = () => {
  const handleClick = (e) => {
    // detect a left click
    if (e.which == 1){ 
      // do something
    }
  };
  return <p onClick={handleClick}>Something</p>;
};

Turns out e.which is undefined for Synthetic Events. How can I distinguish between left and right clicks here?

Javascript Solutions


Solution 1 - Javascript

In modern versions of React (v16+), both onClick and onContextMenu props need to be passed to detect both left- and right-click events:

return <p onClick={handleClick} onContextMenu={handleClick}>Something</p>

You can either check against e.nativeEvent.button (as the other answer implies), or check e.type on the synthetic event itself.

Using e.type

const handleClick = (e) => {
  if (e.type === 'click') {
    console.log('Left click');
  } else if (e.type === 'contextmenu') {
    console.log('Right click');
  }
};

Using e.nativeEvent

const handleClick = (e) => {
  if (e.nativeEvent.button === 0) {
    console.log('Left click');
  } else if (e.nativeEvent.button === 2) {
    console.log('Right click');
  }
};

Here's an updated demo demonstrating how this works.

You may also want to read the React documentation for SyntheticEvent.

(original demo)

Solution 2 - Javascript

The property you're looking for is e.button or e.buttons.

> The button number that was pressed when the mouse event was fired: Left button=0, middle button=1 (if present), right button=2.
>MDN:Web/Events/click

However, with or without react, I'm only getting click events with the left mouse button (trackpad). You could use onMouseDown which works for me.

Here's a demo using e.buttons. You may want to preventDefault in onContextMenu also.

Solution 3 - Javascript

Use:

if (e.button === 0) { // or e.nativeEvent.which === 1
    // do something on left click
}

Here is a DEMO

Solution 4 - Javascript

onContextMenu={e => console.log("right-click")}


onClick={e => console.log("left-click")}

I found this solution on React's official documentation in the "Mouse Events" section.

Here's the TypeScript definition of onContextMenu's synthetic event.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBhargav PonnapalliView Question on Stackoverflow
Solution 1 - JavascriptDhirajView Answer on Stackoverflow
Solution 2 - JavascriptBrigandView Answer on Stackoverflow
Solution 3 - JavascriptmarcelView Answer on Stackoverflow
Solution 4 - JavascriptKristiyan TsvetanovView Answer on Stackoverflow