我在 Firefox OS Simulator 中安装了一个聊天应用程序。
该应用程序添加了contextmenu
事件监听器,允许我删除单个消息。
但是,该事件监听器阻止我选择消息中的文本。
我并不关心这个问题在触摸设备上是如何解决的。因为我用的是 PC,所以我可以contextmenu
通过单击鼠标右键来发送事件监听器。
因此,当我按住鼠标左键时,我希望获得该contextmenu
事件的红色,但仍然能够选择文本。
答案1
这是每个应用程序的解决方案:
找到应用程序的路径。它将类似于
[Firefox profile]\extensions\[Firefox OS Simulator]\profile\webapps\[ID]\application.zip
备份并提取
找到添加事件监听的JS文件
contextmenu
。可能是这样的
someThing.addEventListener('contextmenu', function handler(event) { // ... });
过滤掉鼠标左键:
someThing.addEventListener('contextmenu', function handler(event) { if(evt.button === 0) return; // ... });
确保模拟器已关闭
- 将修改后的文件插入到正确的位置
application.zip
。
答案2
这种行为不是一个错误,而是一个功能:
模拟桌面上的触摸事件
如果您仍想禁用它,请按照以下步骤操作:
- 打开 Firefox 的配置文件夹:
- 去
about:support
- 找到“应用程序基础知识”部分
- 在表中找到“配置文件夹”条目
- 点击“显示文件夹”按钮
- 去
- 转至
extensions
子文件夹 - 找到你的模拟器的文件夹,例如
[email protected]
- 转至
b2g/modules/devtools
子文件夹 touch-events.js
使用适当的文本编辑器打开文件查找
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; },
注释掉此行以避免分派事件:
// target.dispatchEvent(evt);
重启模拟器
请注意,重要的是只阻止事件的分派,而不是不调用sendContextMenu
。否则,点击不会被取消(this.cancelClick = true
),因此文本选择将无法正常工作。