Как избежать ContextMenu после долгого нажатия мыши в Firefox OS Simulator

Как избежать ContextMenu после долгого нажатия мыши в Firefox OS Simulator

Я установил приложение чата в Firefox OS Simulator.

Это приложение добавляет contextmenuпрослушиватели событий, что позволяет мне удалять отдельные сообщения.

Однако этот прослушиватель событий не позволяет мне выделять текст в сообщениях.

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

Связанный контент