ChatGPT No-Focus Injector

Block all auto-focus on chatgpt.com; listen for postMessage and inject+send without stealing focus

当前为 2025-05-12 提交的版本,查看 最新版本

// ==UserScript==
// @name         ChatGPT No-Focus Injector
// @description  Block all auto-focus on chatgpt.com; listen for postMessage and inject+send without stealing focus
// @match        https://chatgpt.com/*
// @run-at       document-start
// @version 0.0.1.20250512161945
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==

(function() {
  'use strict';

  // 1) Block every element’s .focus()
  const nativeFocus = HTMLElement.prototype.focus;
  HTMLElement.prototype.focus = function() {
    // no-op: blocks ChatGPT’s auto-focus entirely
  };

  // 2) Grab the native setter for <textarea>.value
  const valueSetter = Object.getOwnPropertyDescriptor(
    HTMLTextAreaElement.prototype, 'value'
  ).set;

  // 3) Listen for window.postMessage("your prompt")
  window.addEventListener('message', event => {
    if (typeof event.data !== 'string') return;
    const text = event.data.trim();
    if (!text) return;

    // 4) Find the hidden React <textarea>
    const ta = document.querySelector('textarea.text-token-text-primary');
    if (!ta) return;

    // 5) Inject via native setter (no focus needed)
    valueSetter.call(ta, text);
    ta.dispatchEvent(new InputEvent('input', { bubbles: true }));

    // 6) Click Send
    const sendBtn = document.getElementById('composer-submit-button');
    if (sendBtn && !sendBtn.disabled) {
      sendBtn.click();
    }
  });
})();