falcon focus

Completely disables focus without blocking clicks or other events

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         falcon focus
// @description  Completely disables focus without blocking clicks or other events
// @match        https://chat.falconllm.tii.ae/*
// @run-at       document-start
// @version 0.0.1.20250531065554
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==

(function () {
  'use strict';

  // 1. No-op focus function
  const noop = () => {};

  // 2. Override focus methods on all elements
  [Element.prototype, HTMLElement.prototype, HTMLInputElement.prototype, HTMLTextAreaElement.prototype].forEach(proto => {
    Object.defineProperty(proto, 'focus', {
      value: noop,
      writable: false,
      configurable: false
    });
  });

  // 3. Always report no active element
  Object.defineProperty(document, 'activeElement', {
    get: () => null,
    configurable: false
  });

  // 4. As a fallback, blur anything that somehow gains focus
  /*window.addEventListener('focus', e => {
    if (e.target && typeof e.target.blur === 'function') {
      e.target.blur();
    }
  }, true);*/

  // 5. Strip any HTML autofocus attributes as they're added
  new MutationObserver(mutations => {
    for (const m of mutations) {
      for (const node of m.addedNodes) {
        if (node.nodeType === 1) {
          if (node.hasAttribute('autofocus')) {
            node.removeAttribute('autofocus');
          }
          node.querySelectorAll && node.querySelectorAll('[autofocus]')
             .forEach(el => el.removeAttribute('autofocus'));
        }
      }
    }
  }).observe(document, { childList: true, subtree: true });
})();