Firefox OS シミュレーターでマウスを長押しした後にコンテキストメニューを回避する方法

Firefox OS シミュレーターでマウスを長押しした後にコンテキストメニューを回避する方法

Firefox OS シミュレータにチャットアプリをインストールしました。

このアプリは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)、テキスト選択が正しく機能しなくなります。

関連情報