Gemini / Fecebookの入力中の意図しない送信を対策する

Facebook に続いて Gemini でも日本語入力時の変換確定操作の Enter で送信されるようになってしまい、これは本格的に変換入力圏がハブられ始めたなと思い、自分でなんとかしてみました。(Gemini に相談です。)以下、解決のための対策です。ブラウザはSafari を想定しており、Gemini と Facebookのサイトでだけ動作するようにしています。

1.Safariに Mac App Storeから「Userscripts」という機能拡張を入れる。

2.機能拡張をONすると、SafariのURL入力欄の左に「</>」マークが表示されるので、そこをクリックして「Open Extention Page」をクリックして、以下のコード(JS)を貼り付ける。

// ==UserScript==
// @name         Gemini & Facebook Perfect Enter Fix
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  変換中のEnterは確定のみ、確定後のEnter空打ちで送信する挙動を完全再現します
// @author       You
// @match        https://gemini.google.com/*
// @match        https://www.facebook.com/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // いま日本語の「変換中(未確定)」かどうかを記録するフラグ
    let isComposing = false;

    // 変換が始まったらフラグをON
    window.addEventListener('compositionstart', function() {
        isComposing = true;
    }, true);

    // 変換が確定(終了)したらフラグをOFF
    window.addEventListener('compositionend', function() {
        // 一瞬だけ判定を遅らせて、Enterキーの沈み込みと同期させる
        setTimeout(() => { isComposing = false; }, 10);
    }, true);

    window.addEventListener('keydown', function(e) {
        const isInput = e.target.tagName === 'TEXTAREA' || 
                        e.target.tagName === 'INPUT' || 
                        e.target.getAttribute('contenteditable') === 'true' ||
                        e.target.closest('[role="textbox"]');
        if (!isInput) return;

        // Enterキー以外の操作はすべてスルー
        if (e.key !== 'Enter') return;

        // 1. 日本語の「変換中」のEnterは、文字の確定だけ。送信イベントは絶対に阻止
        if (isComposing || e.isComposing || e.keyCode === 229) {
            e.stopPropagation();
            return;
        }

        // 2. 完全に文字が「確定した後」のEnter空打ち
        // 修飾キー(ShiftやOptなど)が押されていない、純粋なEnter単体ならそのまま通す(=送信される)
        if (!e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey) {
            // ここでは stopPropagation をあえて呼ばず、サイト本来の「Enter送信」をそのまま発火させます
        }
    }, true); // キャプチャリングで確実に先回り
})();

これで昔のような使い勝手になると思います。

 

コメント

タイトルとURLをコピーしました