![Firefox OS シミュレーターでマウスを長押しした後にコンテキストメニューを回避する方法](https://rvso.com/image/1465813/Firefox%20OS%20%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%92%E9%95%B7%E6%8A%BC%E3%81%97%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
Firefox OS シミュレータにチャットアプリをインストールしました。
このアプリは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
)、テキスト選択が正しく機能しなくなります。