Я установил приложение чата в Firefox OS Simulator.
Это приложение добавляет contextmenu
прослушиватели событий, что позволяет мне удалять отдельные сообщения.
Однако этот прослушиватель событий не позволяет мне выделять текст в сообщениях.
Мне все равно, как эта проблема решается в сенсорных устройствах. Поскольку я использую ПК, я могу отправить 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
), поэтому выделение текста не будет работать должным образом.