如何在 Firefox OS 模拟器中长按鼠标后避免出现 ContextMenu

如何在 Firefox OS 模拟器中长按鼠标后避免出现 ContextMenu

我在 Firefox OS Simulator 中安装了一个聊天应用程序。

该应用程序添加了contextmenu事件监听器,允许我删除单个消息。

但是,该事件监听器阻止我选择消息中的文本。

我并不关心这个问题在触摸设备上是如何解决的。因为我用的是 PC,所以我可以contextmenu通过单击鼠标右键来发送事件监听器。

因此,当我按住鼠标左键时,我希望获得该contextmenu事件的红色,但仍然能够选择文本。

答案1

这是每个应用程序的解决方案:

  1. 找到应用程序的路径。它将类似于

    [Firefox profile]\extensions\[Firefox OS Simulator]\profile\webapps\[ID]\application.zip
    
  2. 备份并提取

  3. 找到添加事件监听的JS文件contextmenu

    可能是这样的

    someThing.addEventListener('contextmenu', function handler(event) {
      // ...
    });
    
  4. 过滤掉鼠标左键:

    someThing.addEventListener('contextmenu', function handler(event) {
      if(evt.button === 0) return;
      // ...
    });
    
  5. 确保模拟器已关闭

  6. 将修改后的文件插入到正确的位置application.zip

答案2

这种行为不是一个错误,而是一个功能:

模拟桌面上的触摸事件

如果您仍想禁用它,请按照以下步骤操作:

  1. 打开 Firefox 的配置文件夹:
    1. about:support
    2. 找到“应用程序基础知识”部分
    3. 在表中找到“配置文件夹”条目
    4. 点击“显示文件夹”按钮
  2. 转至extensions子文件夹
  3. 找到你的模拟器的文件夹,例如[email protected]
  4. 转至b2g/modules/devtools子文件夹
  5. touch-events.js使用适当的文本编辑器打开文件
  6. 查找sendContextMenu函数:

    sendContextMenu: function teh_sendContextMenu(target, x, y, delay) {
      let doc = target.ownerDocument;
      let evt = doc.createEvent('MouseEvent');
      evt.initMouseEvent('contextmenu', true, true, doc.defaultView,
                         0, x, y, x, y, false, false, false, false,
                         0, null);
      let content = this.getContent(target);
      let timeout = content.setTimeout((function contextMenu() {
        target.dispatchEvent(evt);
        this.cancelClick = true;
      }).bind(this), delay);
      return timeout;
    },
    
  7. 注释掉此行以避免分派事件:

    // target.dispatchEvent(evt);
    
  8. 重启模拟器

请注意,重要的是只阻止事件的分派,而不是不调用sendContextMenu。否则,点击不会被取消(this.cancelClick = true),因此文本选择将无法正常工作。

相关内容