javascript React合成事件区分左和右点击事件

ekqde3dh  于 2022-12-17  发布在  Java
关注(0)|答案(5)|浏览(374)

我正在尝试区分onClick函数中的左键单击和右键单击:

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

原来e.which对于Synthetic Events是未定义的。我如何区分这里的左键和右键单击呢?

vybvopom

vybvopom1#

在React(v16+)的现代版本中,需要传递onClickonContextMenu prop 来检测左键和右键单击事件:

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

您可以检查e.nativeEvent.button(如另一个答案所示),也可以检查合成事件本身的e.type
使用e.type

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

使用e.nativeEvent

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

下面是一个updated demo,演示了它的工作原理。
您可能还需要阅读SyntheticEvent的React文档。

  • 一个月一次 *
gojuced7

gojuced72#

您正在寻找的物业是e.buttone.buttons
触发鼠标事件时按下的按钮编号:左按钮=0,中按钮=1(如果存在),右按钮=2。

  • MDN:Web/Events/click
    然而,不管有没有react,我只得到了鼠标左键(触控板)的点击事件。你可以使用onMouseDown,这对我很有效。
    这是一个使用e.buttonsdemo。您可能还想在onContextMenu中阻止默认设置。
u4vypkhs

u4vypkhs3#

用途:

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

Here is a DEMO

nwsw7zdq

nwsw7zdq4#

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

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

我在React's official documentation的“鼠标事件”部分找到了这个解决方案。
下面是onContextMenu的合成事件的TypeScript definition

yjghlzjz

yjghlzjz5#

我用来区分左键和右键单击的方法是:

const buttons = {
  left: 0,
  middle: 1,
  right: 2,
};

export const App = () => {
  const handleChange = (e) => {
    if (e.button === buttons.left) {
      console.log('left');
    } else if (e.button === buttons.middle) {
      console.log('middle');
    } else if (e.button === buttons.right) {
      console.log('right');
    }
 };

 return (
    <div onContextMenu={(e) => e.preventDefault()} onMouseDown={handleChange}>
      Click me!
    </div>
 );
};

相关问题