0%

关于点击鼠标右键在firefox上面的坑

昨天遇到一个这样的需求:

在浏览器内点击鼠标右键弹出菜单选项

OK,这样的需求很简单,马上有了思路:

  1. 写出菜单,默认隐藏
  2. 在document上监听contextmenu事件,触发时显示菜单, 并阻止浏览器默认行为(重要,否则会显示浏览器自带的邮件菜单)
  3. 监听document的click事件,隐藏菜单
  4. 菜单监听自身的click事件,触发菜单自身事件,并阻止冒泡(否则会促发第三步的事件)

想法一有,马上啪啪啪写出效果来,自己过了浏览器兼容性,基本OK

但是……

当在firefox上时,却发现一个奇怪的现象,点击右键的时候,菜单闪一下又隐藏了,这就说明第二步跟第三步的事件按序触发了.

说明火狐在右键的时候,click事件也会同时触发,搜索了资料之后,发现这是一个古老的bug,到现在都没修好

思考了一下,想到两种方式解决这个问题:

  • contextmenu触发后,马上锁定一个信号量,并设置短时间后停止(setTimeout方式解锁),click事件触发时,当检测到锁定,那就不触发隐藏,如此便能解决,但是有一个问题,这样就没办法再短时间内右键又左键,稍微有点缺陷
  • 第二种方法便是,当contextmenu触发后,记录坐标,click事件触发时,检测坐标,如果一样(可设置偏差),便不触发。

最终把问题解决了

Welcome to my other publishing channels